1

让我们采取以下实体:

class Item{
    @Id
    Long id;
    String name;
    org.joda.money.Money price;
}

和相应的存储库:

interface ItemRepository extends CrudRepository<Item, Long> {
}

是否可以在不手动重写提供的 SQL 查询的情况下将 Item 保存在单独的列中具有金额和货币的关系数据库表中ItemRepository

DDL 可能类似于:

CREATE TABLE ITEM (
    ID             INTEGER IDENTITY NOT NULL,
    NAME           VARCHAR(255)     NULL,
    PRICE_AMOUNT   DECIMAL          NULL,
    PRICE_CURRENCY VARCHAR(3)       NULL
);

使用自定义将钱存储在单个VARCHAR列中@WritingConverter@ReadingConverter这是我得到的最接近的,但这不是一个选项,因为我需要在数据库级别明确区分金额和货币。

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

4

1 回答 1

2

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

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

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

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

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

于 2019-12-22T12:52:24.310 回答