例如,我有一些实体,如:
@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'字段指定实体有效的时间。
所以我的问题是:是否可以使用任何自定义验证/注释来检查唯一性仅有效实体(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 |
-----------------------------------------------------------------
由于
答案 0 :(得分:0)
我不确定理解你的问题但是。
@PreUpdate
@PrePersist
public void checkEntity() {
if ( validThru != null && validThru.getTime() > new Date().getTime() ) {
throw new SomeException("Invalid entity");
}
}
可以胜任。
当您使用unique=true
时,约束不在代码级别,它处于数据库级别。如果要确保更高级的约束,请创建一个拒绝插入和更新的触发器。
如果无法对触发器进行编码,则必须使用应用代码强制实体一致性。创建一个save(entity)
的服务,该服务将拒绝具有异常的错误实体。
答案 1 :(得分:0)
而不是日期,您可以在verion和id上使用TimeStamp.and唯一列约束。因此,您的记录可能是唯一的任何情况。 另一种可以将状态用作列的方法其中,praticular记录Valid-V和Invalid -I.you只能根据选择显示有效或无效的记录