2016-03-06 2 views
7

Questions:Hibernate 5 et critères typées requêtes (JPA2)

1) Si je mise à niveau de 4.x Mise en veille prolongée à Hibernate 5.x, puis-je utiliser les critères "anciens" Requêtes, ou seulement le nouveau Type Requêtes de critères JPA2? L'ancien est-il obsolète, ou puis-je utiliser les deux côte à côte?

2) Ai-je bien compris que les nouveaux critères typés m'obligent à créer une seconde classe pour chacun Classe d'entité que j'ai, dupliquant ainsi le nombre de classes? Suis-je censé créer ces classes à la main? Si non, comment? Rant: Avoir à dupliquer les cours semble bizarre, donc je dois mal le comprendre d'une manière ou d'une autre? N'est-ce pas exagéré et inutilement compliqué?

Répondre

10
  1. Non, l'ancienne API de critères n'est pas obsolète. Il suffit de regarder the javadoc: il n'y a pas d'avertissement de dépréciation. Mais je recommande de ne pas utiliser l'API JPA standard avec l'API Hibernate propriétaire.

  2. Non, cela ne vous force pas. Vous pouvez toujours utiliser des identifiants de chaîne. Mais si la sécurité de type est l'objectif, l'utilisation des classes de métamodèle est fortement recommandée.

Bien sûr, vous n'avez pas besoin de les générer manuellement. Ils sont générés par an annotation processor à partir de vos classes d'entités et de leurs annotations de mappage. Vous pouvez trouver bizarre, mais il est beaucoup plus sûr d'utiliser root.get(MyEntity_.firstName) que root.get("firstName"): une faute de frappe est détectée au moment de la compilation, et si vous refactorisez le champ à firstname, le compilateur générera une erreur au lieu de vous laisser utiliser l'ancien "firstName" identificateur de chaîne. Je trouve toujours les requêtes JPQL beaucoup plus simples à écrire, à comprendre et à maintenir, et j'utiliserais uniquement l'API de critères lorsqu'une requête dynamique doit être générée en fonction de plusieurs critères. Utilisez des tests automatisés pour vérifier si les requêtes sont correctes. Faites de même, même avec les requêtes de critères, BTW.

+0

Si vous refactorisez le champ en prénom, le compilateur génèrera-t-il une erreur ou le processeur d'annotation changera-t-il immédiatement MyEntity_firstName' en MyEntity_.newName', pour que je ne reçoive aucune erreur? – MarcG

+0

Le processeur d'annotation va changer MyEntity_.firstName en MyEntity_.newName, et vous obtiendrez ainsi des erreurs de compilation dans tous les endroits de votre code où vous utilisiez MyEntity_.firstName. –

+2

Oui, bien sûr, puisque le processeur d'annotation ne fait pas de refactorisation via l'IDE. Jeez déteste vraiment ce nouveau critère. Comme vous l'avez suggéré, nos tests automatisés détectent immédiatement toutes les erreurs d'identification de chaîne, donc je ne vois pas le changement de point. La lisibilité des anciens critères d'Hibernate est bien meilleure et c'est ce qui compte le plus pour nous. Merci pour l'info. – MarcG