[英]Persisting Money with Spring Data JDBC
让我们以以下实体为例:
class Item{
@Id
Long id;
String name;
org.joda.money.Money price;
}
和相应的存储库:
interface ItemRepository extends CrudRepository<Item, Long> {
}
是否可以在不手动重写ItemRepository
提供的 SQL 查询的情况下,将 Item 保存在具有单独列中的金额和货币的关系数据库表中?
DDL 可能是这样的:
CREATE TABLE ITEM (
ID INTEGER IDENTITY NOT NULL,
NAME VARCHAR(255) NULL,
PRICE_AMOUNT DECIMAL NULL,
PRICE_CURRENCY VARCHAR(3) NULL
);
使用自定义@WritingConverter
和@ReadingConverter
将 Money 存储在单个VARCHAR
列中是我得到的最接近的,但这不是一个选项,因为我需要在 DB 级别明确分开金额和货币。
如果这有所不同,我可以替换joda.money
以支持javax.money
,但是我不想引入我自己的自定义类型来处理域层中的资金。
有以下选项可用于在 Spring Data JDBC 中持久化非标准类型的属性
使用@WritingConverter
和@ReadingConverter
将值转换为 Spring Data JDBC 知道的值。 您已经发现这仅适用于单列
您可以将其标记为@Embedded
,它将每个属性转换为一列。 我不确定Money
是否具有合适的属性,但它缺少合适的构造函数,因此这也不起作用。
使用可以通过第一种方法处理的不同类型。 在这种情况下,这意味着编写您自己的Money
类型,该类型具有合适的构造函数和属性以作为嵌入式工作。
调整您的数据库:您可以创建一个使用单列表示并将其存储为单列的视图。 它可能仍然可以将其作为单独的列用于排序和过滤。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.