使用Hibernate验证,我可以查询正在验证的实体吗?

使用Hibernate验证,我可以查询正在验证的实体吗?,hibernate,hibernate-validator,Hibernate,Hibernate Validator,我有一个实体,需要对其实施以下约束: X列和Y列的任意组合只能有一条记录,如果记录类型为A,则Z列为空 最后一部分将此从简单的唯一性约束转换为更复杂的约束。我正在编写一个自定义Hibernate验证器来检查它 我正在做的是: @Override public boolean isValid(MyEntity value, ConstraintValidatorContext context) { Query query = DB.createQuery( // DB is just a

我有一个实体,需要对其实施以下约束: X列和Y列的任意组合只能有一条记录,如果记录类型为A,则Z列为空

最后一部分将此从简单的唯一性约束转换为更复杂的约束。我正在编写一个自定义Hibernate验证器来检查它

我正在做的是:

@Override
public boolean isValid(MyEntity value, ConstraintValidatorContext context) {
    Query query = DB.createQuery( // DB is just a convenience class
                "select count(*) from MyEntity" +
                "  where propertyX = :propertyX" +
                "    and propertyY = :propertyY" +
                "    and type = :type" +
                "    and propertyZ is null")
                .setParameter("propertyX", value.getPropertyZ())
                .setParameter("propertyY", value.getPropertyY())
                .setParameter("type", MyType.PRIMARY);

     return query.getResultList().size() <= 1;
}

另一件需要注意的事情是,当第一次插入完成时,表是空的

问题是,我可以查询我试图验证的同一个表吗?这似乎是一个非常合乎逻辑的要求,因为约束注释可以放在类上。我的验证取决于数据的状态。

受在会话触发的任何回调方法中调用/使用同一会话的启发和知识,我通过抓住我的
EntityManagerFactory
,从而获得了
EntityManager
,非常简单地解决了这个问题,这给了我一个新的
会话
。现在我可以用它来做查询了

EntityManager em = emFactory.createEntityManager();
session = (Session) em.getDelegate();
Query query = session.createQuery(...

注意:来自的,
getDelegate()
是特定于实现的。我正在使用
tomcat
hibernate
,它工作得很好。

我想知道它是否在事务中为persist执行新的查询查找?来自hibernate的:“在会话触发的任何回调方法中调用/使用同一个会话都不好。”这可能是问题所在。谢谢。我有一个类似的问题-没有使用单独的实体管理器意味着我在验证器中的查询只是挂起而没有返回…@StefanHaberl我很高兴这对某人有用。当我遇到这个问题时,似乎没有其他人感兴趣。
EntityManager em = emFactory.createEntityManager();
session = (Session) em.getDelegate();
Query query = session.createQuery(...