为bean配置Hibernate验证

时间:2010-05-14 15:04:35

标签: hibernate validation configuration bean-validation

我需要根据SQL查询结果执行验证。

查询被定义为注释 - 在我的实体bean中为 @NamedQuery

根据Hibernate文档(doc),可以在以下操作中验证bean:
的更新前的
插入预
预删除

看起来像:

<hibernate-configuration>
    <session-factory>
       ...
    <event type="pre-update">
       <listener class="org.hibernate.cfg.beanvalidation.BeanValidationEventListener"/>
    </event>
    <event type="pre-insert">
        <listener class="org.hibernate.cfg.beanvalidation.BeanValidationEventListener"/>
    </event>
    <event type="pre-delete">
        <listener class="org.hibernate.cfg.beanvalidation.BeanValidationEventListener"/>
    </event>
</hibernate-configuration>

问题是如何连接我的bean 和验证配置,如上所述。

更新

实体类

...
@Entity
@NamedQuery(name = "isValutaKursExists", query = "SELECT id FROM CurrencyRate WHERE bankId = :bankNum")
@Table(name = "Currency")
public class Currency {
...

2 个答案:

答案 0 :(得分:3)

  

问题是如何将我的bean与验证配置连接起来,如上所述。

您需要使用Bean Validation API中的注释注释您的bean,以添加@NotNull@Size@NamedQueryconstraints)或定义您自己的built-in。但是,Bean验证并不意味着基于SQL查询结果执行验证

顺便说一下,你提到{{1}}所以我猜你正在使用Hibernate EntityManager。在这种情况下,我建议将Bean Validation与JPA(而不是Hibernate)集成。如果您使用的是JPA 2.0,只需将Bean Validation实现放在类路径上即可。如果您使用的是JPA 1.0,请参阅this previous answer

答案 1 :(得分:3)

是的,正确的方法是自定义约束,如 ValidCurrency 和匹配的 ValidCurrencyValidator 。您将需要访问您的Hibernate Session resp。 ConstraintValidator实现中的EntityManager。您可以在Hibernate wiki上了解如何执行此操作 - Accessing the Hibernate Session within a ConstraintValidator