用 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

中保留非标准类型的属性
  1. 使用 @WritingConverter@ReadingConverter 将值转换为 Spring 数据 JDBC 知道的值。您已经发现这仅适用于单列

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

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

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