用 Spring 数据 JDBC 保存金钱
Persisting Money with Spring Data JDBC
让我们来看一个实体:
class Item{
@Id
Long id;
String name;
org.joda.money.Money price;
}
和相应的存储库:
interface ItemRepository extends CrudRepository<Item, Long> {
}
是否可以在不手动重写 SQL 提供的 ItemRepository
查询的情况下,将 Item 保存在关系数据库 table 中,并将金额和货币分列在不同的列中?
DDL 可能类似于:
CREATE TABLE ITEM (
ID INTEGER IDENTITY NOT NULL,
NAME VARCHAR(255) NULL,
PRICE_AMOUNT DECIMAL NULL,
PRICE_CURRENCY VARCHAR(3) NULL
);
使用自定义 @WritingConverter
和 @ReadingConverter
将钱存储在单个 VARCHAR
列中是我得到的最接近的,但是这不是一个选项,因为我需要金额和货币明确分开在数据库级别。
我可以用 joda.money
代替 javax.money
如果这会有所不同,但是我不想引入我自己的自定义类型来处理域层中的钱。
有以下选项可用于在 Spring 数据 JDBC
中保留非标准类型的属性
使用 @WritingConverter
和 @ReadingConverter
将值转换为 Spring 数据 JDBC 知道的值。您已经发现这仅适用于单列
您可以将其标记为 @Embedded
,这会将每个属性转换为一列。我不确定 Money
是否有合适的属性,但它缺少合适的构造函数,所以这也不起作用。
使用您可以使用第一种方法处理的不同类型。在这种情况下,这意味着编写您自己的 Money
类型,它具有合适的构造函数和属性以作为嵌入式工作。
调整您的数据库:您可以创建一个视图,该视图使用单列表示并将其存储为单列。它可能仍然可以作为单独的列进行排序和过滤。
让我们来看一个实体:
class Item{
@Id
Long id;
String name;
org.joda.money.Money price;
}
和相应的存储库:
interface ItemRepository extends CrudRepository<Item, Long> {
}
是否可以在不手动重写 SQL 提供的 ItemRepository
查询的情况下,将 Item 保存在关系数据库 table 中,并将金额和货币分列在不同的列中?
DDL 可能类似于:
CREATE TABLE ITEM (
ID INTEGER IDENTITY NOT NULL,
NAME VARCHAR(255) NULL,
PRICE_AMOUNT DECIMAL NULL,
PRICE_CURRENCY VARCHAR(3) NULL
);
使用自定义 @WritingConverter
和 @ReadingConverter
将钱存储在单个 VARCHAR
列中是我得到的最接近的,但是这不是一个选项,因为我需要金额和货币明确分开在数据库级别。
我可以用 joda.money
代替 javax.money
如果这会有所不同,但是我不想引入我自己的自定义类型来处理域层中的钱。
有以下选项可用于在 Spring 数据 JDBC
中保留非标准类型的属性使用
@WritingConverter
和@ReadingConverter
将值转换为 Spring 数据 JDBC 知道的值。您已经发现这仅适用于单列您可以将其标记为
@Embedded
,这会将每个属性转换为一列。我不确定Money
是否有合适的属性,但它缺少合适的构造函数,所以这也不起作用。使用您可以使用第一种方法处理的不同类型。在这种情况下,这意味着编写您自己的
Money
类型,它具有合适的构造函数和属性以作为嵌入式工作。调整您的数据库:您可以创建一个视图,该视图使用单列表示并将其存储为单列。它可能仍然可以作为单独的列进行排序和过滤。