Java Hibernate:如何使用同一表(或实体)的两列(字段)创建约束
Java Hibernate:如何使用同一表(或实体)的两列(字段)创建约束,java,hibernate,jakarta-ee,orm,relational-database,Java,Hibernate,Jakarta Ee,Orm,Relational Database,我有一个hibernate实体,它包含两个日期:start和finish @Entity public class MyEntity{ private Date start private Date finish; ... @Temporal(TemporalType.DATE) @Column(name = "start", nullable = false) public Date getStart() { return s
我有一个hibernate实体,它包含两个日期:
start
和finish
@Entity
public class MyEntity{
private Date start
private Date finish;
...
@Temporal(TemporalType.DATE)
@Column(name = "start", nullable = false)
public Date getStart() {
return start
}
@Temporal(TemporalType.DATE)
@Column(name = "finish", nullable = false)
public Date getFinish() {
return finish;
}
}
我想引入一个约束,即start
必须在finish
之前,我可以在hibernate实体中执行这种验证/检查,以避免在表中写入无效数据吗
如果是,如何进行?
我猜不是,也许我得写个触发器。。是这样吗?有更好的想法吗?您可以使用它为您的实体添加虚拟化。你需要介绍你自己的 也可以在DAO层中手动执行:
public class MyEntityDAO{
....
protected void save(MyEntity entity) {
// check dates
// throw some exception in a case of problems
getCurrentSession().saveOrUpdate(entity);
}
}
另一个缺点是,如果您保存一些父实体,而MyEntity实体
将以级联方式保存,则此功能将不起作用
更简单的解决方案可能是使用@PrePersist
:
@Entity
public class MyEntity{
....
@PrePersist
protected void checkDates() {
// check dates
// throw some runtime exception in a case of problems
}
}
但我不确定在这种情况下,trnsaction是否会在默认情况下回滚。+1为@PrePersist suggestion生成Maksym,只是进一步考虑了这个想法 您还可以将@PrePersist与@EntityListeners一起使用来处理实体验证:
public class MyEntityValidationEventListener {
@PrePersist
public void validate(Object entity) {....}
}
@Entity
@EntityListeners(MyEntityValidationEventListener.class)
public class MyEntity {...}
+1.谢谢分享。它将使您能够分离实体(POJO)和验证代码