我需要根据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 {
...
答案 0 :(得分:3)
问题是如何将我的bean与验证配置连接起来,如上所述。
您需要使用Bean Validation API中的注释注释您的bean,以添加@NotNull
,@Size
,@NamedQuery
(constraints)或定义您自己的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