2


我有一个包含两个日期的休眠实体:startfinish.

@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
我可以在休眠实体中进行这种验证/检查以避免在我的表中写入无效数据吗?
如果是,如何?
我的猜测不是,可能我必须写一个触发器..对吗?有更好的主意吗?

4

2 回答 2

2

您可以使用Hibernate Validator为您的实体添加 vlaidation。您需要引入自己的自定义约束

或者您可以在 DAO 层中手动执行此操作:

public class MyEntityDAO{ 

    ....

    protected void save(MyEntity entity) {
      // check dates
      // throw some exception in a case of problems
      getCurrentSession().saveOrUpdate(entity);
    }
}

MyEntity entity不利的一面是,如果您保存一些父实体并将通过级联保存,这将不起作用。

一个更容易做的解决方案可能是使用@PrePersist

@Entity
public class MyEntity{ 

    ....

    @PrePersist
    protected void checkDates() {
      // check dates
      // throw some runtime exception in a case of problems
    }
}

但我不确定在这种情况下 trnsaction 是否会默认回滚。

于 2013-04-11T16:05:08.350 回答
1

为 @PrePersist 的建议向 Maksym +1,只是进一步推进了这个想法。

您还可以使用 @PrePersist 和 @EntityListeners 来处理实体验证:

public class MyEntityValidationEventListener {
   @PrePersist
   public void validate(Object entity) {....}
}

@Entity
@EntityListeners(MyEntityValidationEventListener.class)
public class MyEntity {...}
于 2013-04-11T17:57:54.990 回答