2010-05-14 109 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