2

我需要根据 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 {
...
4

2 回答 2

3

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

您需要使用 Bean Validation API 中的注释对 bean 进行注释,以添加约束@NotNull,例如@Size内置)或定义您自己的约束。但是 Bean Validation 并不是真的要根据 SQL 查询结果进行验证

顺便说一句,你提到@NamedQuery了所以我猜你正在使用 Hibernate EntityManager。在这种情况下,我建议将 Bean Validation 与 JPA(而不是 Hibernate)集成。如果您使用的是 JPA 2.0,只需将 Bean Validation 实现放在类路径上。如果您使用的是 JPA 1.0,请参阅这个先前的答案

于 2010-05-14T16:19:46.583 回答
3

是的,正确的方法是自定义约束,如ValidCurrency和匹配的ValidCurrencyValidator。您将需要访问您的休眠会话。ConstraintValidator 实现中的 EntityManager。您可以在 Hibernate wiki - Accessing the Hibernate Session within a ConstraintValidator上获得有关如何执行此操作的一些想法

于 2010-05-20T09:23:39.330 回答