java - Hibernate 唯一约束

标签 java hibernate

例如,我有一些实体,例如:

@Entity
public class WorkingScheduleOverride implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Version
    private Integer version;

    @Column
    private Date validFrom;

    @Column
    private Date validThru;

    @Column
    private Date timestamp;

    @Column(unique = true)
    private Date date;

为了按字段日期检查实体是否唯一,我添加了(unique = true)。这工作得很好,但前提是不对实体使用“可关闭”方法。如果您想跟踪这些对象的历史记录,则适用于这种情况。因此,我使用“validThru”字段来指定实体有效的时间。

所以我的问题是:是否可以使用任何自定义验证/注释来检查唯一性ONLY VALID实体(validThru == null || validThru < new Date()) .

数据库中的数据不正确(两条记录具有相同的日期且均有效):

-----------------------------------------------------------------
id  |version    |timestamp  |valid_from |valid_thru |date       |
-----------------------------------------------------------------
1   |1          |2012-01-01 |2012-01-01 |null       |2013-01-01 |
-----------------------------------------------------------------
2   |1          |2012-01-01 |2012-01-01 |null       |2013-01-01 |
-----------------------------------------------------------------

数据库中的数据正确(两条记录具有相同的日期,但第二条记录无效):

-----------------------------------------------------------------
id  |version    |timestamp  |valid_from |valid_thru |date       |
-----------------------------------------------------------------
1   |1          |2012-01-01 |2012-01-01 |null       |2013-01-01 |
-----------------------------------------------------------------
2   |1          |2012-01-01 |2012-01-01 |2012-06-01 |2013-01-01 |
-----------------------------------------------------------------

数据库中的数据不正确(两条记录具有相同的日期且均有效,第二条记录仅在 2014 年 1 月 1 日失效):

-----------------------------------------------------------------
id  |version    |timestamp  |valid_from |valid_thru |date       |
-----------------------------------------------------------------
1   |1          |2012-01-01 |2012-01-01 |null       |2013-01-01 |
-----------------------------------------------------------------
2   |1          |2012-01-01 |2012-01-01 |2014-01-01 |2013-01-01 |
-----------------------------------------------------------------

谢谢

最佳答案

我不确定是否理解你的问题。

@PreUpdate
@PrePersist
public void checkEntity() {
    if ( validThru != null && validThru.getTime() > new Date().getTime() ) {
        throw new SomeException("Invalid entity");
    }
}

可以完成这项工作。

<小时/>

当您使用unique=true时,约束不是在代码级别,而是在数据库级别。如果您想确保更高级的约束,请创建一个拒绝插入和更新的触发器。

如果无法对触发器进行编码,则必须强制实体与应用代码保持一致。创建一个带有 save(entity) 的服务,该服务将拒绝不良实体并抛出异常。

关于java - Hibernate 唯一约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17889755/

相关文章:

java - Objectify 5 的多态性

java - 在 java 中打印多维数组的最佳方法是什么?

Java 泛型 : Multiple Inheritance in Bounded Type Parameters <T extends A & I>

java - 使一个 bean 成为默认的 spring bean

java - Infinispan 软索引文件存储问题

java - 插入数据库的集成测试问题

java - 如何在ArrayList<String>上方添加注解 | hibernate (日本)

c# - 将 Java Map<string, string> 从 XML 解析为 C# 对象

c# - NHibernate查询问题

java - 计算mysql中的总登录注销时间