【问题标题】:JPA Constraint for date year日期年份的 JPA 约束
【发布时间】:2012-04-13 13:32:17
【问题描述】:

我有一个代表文档的实体,如下所示:

文档 日期创作 doc_number doc_origin

文档通常被称为'2012/XY/005',这将是2012年由XY发起的第五个文档。 所以 number 必须在它创建的年份和同一 Origin 中是唯一的,我需要为它设置一个约束。

使用 JPA 对其进行建模和映射的最佳方法是什么?

我认为我的选择是:

选项1:在创建日期时将另一字段作为年份的文档实体,并使其唯一(年份,文档编号,文档来源)

选项 2: 创建一个字段 doc_ref 并放入一个类似于 'YEAR/ORIG/NUMBER' 的字符串并使其唯一(doc_ref)

两个选项都添加了另一个重复年份的字段,但选项 1 要求我更新字段年份与 date_creation 一致,选项 2 要求我更新字段 doc_ref 与其余字段一致,所以我倾向于认为选项 1 是最好的。

还有其他我没有看到的选项吗? 谢谢!

【问题讨论】:

    标签: java jpa unique-constraint


    【解决方案1】:

    如果您的数据库允许,您可以使用基于函数的唯一索引。 Oracle 中的示例:

    CREATE UNIQUE INDEX YEAR_ORIGIN_NUMBER_IDX 
    on DOCUMENT (TRUNC(DT_CREATION, 'YEAR'), DOC_ORIGIN, DOC_NUMBER)
    

    【讨论】:

    • 是的,但我也需要这个在 JPA 中工作,你知道这是否可能吗?
    • 对数据库表应用唯一约束。 JPA 与它没有太大关系。您可以使用 JPA 注释定义唯一约束,但这些仅在 JPA 实现为您创建数据库表(或 DDL)时使用。最后,约束存在于数据库中。
    • 根据文档here,JPA 运行时还必须进行约束声明并确保语句的顺序以避免违反唯一约束。
    • 另外,我想在 JPA 中进行声明,因为我正在尝试与应用程序数据库无关,并且我正在使用 Hibernate 工具来生成 DDL。
    • 然后使用您在问题中提出的解决方案,并使年份字段对外部不可见。确保修改日期的实体的每个方法也相应地修改日期。
    猜你喜欢
    • 2015-01-30
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 2022-01-14
    相关资源
    最近更新 更多