2010-05-14 111 views
2

我需要基于SQL查询结果执行验证。为bean配置Hibernate验证

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

根据Hibernate文档(doc),有可能验证在下面的操作豆:
预更新
前插入
预删除

的样子:

<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> 

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

更新:

实体类

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

回答

3

的问题是如何将我的豆与验证的配置,上述连接。

你需要从Bean验证API注解注释你的bean添加constraints@NotNull@Sizebuilt-in),或定义自己的。但是,Bean Validation并不是真正意义上的根据SQL查询结果执行验证。

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

+0

谢谢你的回答,Pascal。是的,应该对SQL结果进行验证。流程如下 - 如果查询结果不为空,则应执行此实体的事务。 – sergionni 2010-05-16 16:19:04

+0

@sergionni不客气。但是恐怕Bean Validation不适合你的流程。 AFAIK,Bean Validation适用于bean验证,而不是查询结果验证。 – 2010-05-16 18:10:09

+0

谢谢,帕斯卡尔,我已更新帖子(添加实体类部分)。所以,可能的一步就是多发展一个班级。像CurrencyValidator,其中我应该实现getNamedQuery(“isValutaKursExists”)? – sergionni 2010-05-17 08:43:08

3

是的,正确的办法是像ValidCurrency和匹配ValidCurrencyValidator定制的约束。你将需要访问你的Hibernate Session resp。你的ConstraintValidator实现中的EntityManager。你可以得到一些关于如何在Hibernate wiki上这样做的想法 - Accessing the Hibernate Session within a ConstraintValidator