2010-05-14 6 views
2

Je dois effectuer une validation en fonction du résultat de la requête SQL.Configuration de la validation Hibernate pour le bean

La requête est définie en tant qu'annotation - @NamedQuery dans mon bean entité.

Selon Hibernate documentation (doc), il est possible de valider le haricot sur les opérations suivantes:
pré-insérer pré-mise à jour

pré-supprimer

ressemble:

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

La question est comment pour connecter mon haricot avec la configuration de validation, décrite ci-dessus.

mise à jour:

entité classe

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

Répondre

3

La question est de savoir comment connecter mon haricot avec la configuration de validation décrite ci-dessus.

Vous devez vous annotés avec annotations haricots de l'API de validation Bean ajouter constraints comme @NotNull, @Size (built-in) ou définir votre propre. Mais la validation du bean n'est pas vraiment destinée à effectuer une validation basée sur le résultat de la requête SQL. En passant, vous avez mentionné @NamedQuery, donc je suppose que vous utilisez Hibernate EntityManager. Dans ce cas, je recommanderais d'intégrer Bean Validation avec JPA (au lieu d'Hibernate). Si vous utilisez JPA 2.0, placez simplement l'implémentation Bean Validation sur le chemin de classe. Si vous utilisez JPA 1.0, reportez-vous à this previous answer.

+0

Merci de votre réponse, Pascal. Oui, la validation doit être effectuée sur le résultat SQL. Le flux suit: dans le cas où le résultat de la requête n'est pas vide, cette transaction pour cette entité doit être effectuée. – sergionni

+0

@sergionni De rien. Mais j'ai peur que Bean Validation ne soit pas le bon outil pour votre flux. AFAIK, la validation de bean est pour, bien, la validation de bean, pas la validation de résultat de requête. –

+0

Merci, Pascal, j'ai mis à jour la publication (partie de classe d'entité ajoutée). Donc, l'étape possible est de développer une classe de plus, quelque chose. comme CurrencyValidator, dans lequel je devrais implémenter getNamedQuery ("isValutaKursExists")? – sergionni

3

Oui, la bonne approche serait une contrainte personnalisée comme ValidCurrency et un correspondant ValidCurrencyValidator. Vous aurez besoin d'accéder à votre Session Hibernate resp. EntityManager dans votre implémentation ConstraintValidator. Vous pouvez obtenir quelques idées sur la façon de le faire sur le wiki Hibernate - Accessing the Hibernate Session within a ConstraintValidator