gpt4 book ai didi

java - Hibernate 唯一约束

转载 作者:行者123 更新时间:2023-12-01 04:31:47 26 4
gpt4 key购买 nike

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

@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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com