Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate:如何使用同一表(或实体)的两列(字段)创建约束_Java_Hibernate_Jakarta Ee_Orm_Relational Database - Fatal编程技术网

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)和验证代码