【问题标题】:Persisting Money with Spring Data JDBC使用 Spring Data JDBC 持久化资金
【发布时间】:2020-04-14 01:30:54
【问题描述】:

我们来看一个实体:

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 将钱存储在单个 VARCHAR 列中是我得到的最接近的方法,但这不是一个选项,因为我需要在数据库级别明确区分金额和货币。

如果这会有所不同,我可以将 joda.money 替换为 javax.money,但我不想引入我自己的自定义类型来处理域层中的资金。

【问题讨论】:

    标签: java spring spring-data mapping spring-data-jdbc


    【解决方案1】:

    有以下选项可用于在 Spring Data JDBC 中持久化非标准类型的属性

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-26
      • 1970-01-01
      • 2014-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多