繁体   English   中英

使用 Spring Data 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> {
}

是否可以在不手动重写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 中持久化非标准类型的属性

  1. 使用@WritingConverter@ReadingConverter将值转换为 Spring Data JDBC 知道的值。 您已经发现这仅适用于单列

  2. 您可以将其标记为@Embedded ,它将每个属性转换为一列。 我不确定Money是否具有合适的属性,但它缺少合适的构造函数,因此这也不起作用。

  3. 使用可以通过第一种方法处理的不同类型。 在这种情况下,这意味着编写您自己的Money类型,该类型具有合适的构造函数和属性以作为嵌入式工作。

  4. 调整您的数据库:您可以创建一个使用单列表示并将其存储为单列的视图。 它可能仍然可以将其作为单独的列用于排序和过滤。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM