2016-03-06 16 views
7

Fragen:5 Hibernate und typisierten Kriterien Abfragen (JPA2)

1) Wenn ich von Hibernate 4.x aktualisieren 5.x auf Hibernate, kann ich immer noch die „alte“ Kriterien Abfragen verwenden, oder nur die neuen Getippt JPA2-Kriterienabfragen? Ist das alte veraltet, oder kann ich beides nebeneinander benutzen?

2) Habe ich richtig verstanden, dass die neuen getippten Kriterien mich zwingt, eine zweite Klasse für jede Entity-Klasse, die ich habe, so die Anzahl der Klassen zu duplizieren? Soll ich diese Klassen manuell erstellen? Wenn nicht, wie? Rant: Klassen zu duplizieren scheint bizarr, also muss ich es irgendwie missverstehen? Ist das nicht übertrieben und unnötig kompliziert?

Antwort

10
  1. Nein, die alte Kriterien-API ist nicht veraltet. Sehen Sie sich einfach the javadoc an: Es gibt keine Verwarnungswarnung. Aber ich würde empfehlen, die Standard-JPA-API beizubehalten und nicht die Standard-JPA-API in Verbindung mit der proprietären Hibernate-API zu verwenden.

  2. Nein, es zwingt Sie nicht. Sie können weiterhin String-IDs verwenden. Aber wenn Typ-Sicherheit das Ziel ist, wird die Verwendung der Metamodell-Klassen dringend empfohlen.

Natürlich müssen Sie diese nicht von Hand generieren. Sie werden von an annotation processor aus Ihren Entitätsklassen und ihren Zuordnungsannotationen generiert. Sie können es seltsam finden, aber es ist viel sicherer, root.get(MyEntity_.firstName) als root.get("firstName") zu verwenden: ein Tippfehler wird zur Kompilierungszeit erkannt, und wenn Sie das Feld zu firstname refaktorieren, wird der Compiler einen Fehler generieren, anstatt Sie die alte "firstName" Zeichenfolgenbezeichner zu verwenden.

Ich finde JPQL-Abfragen immer noch viel einfacher zu schreiben, zu verstehen und zu pflegen, und würde nur die Kriterien-API verwenden, wenn eine dynamische Abfrage basierend auf mehreren ... Kriterien generiert werden muss. Verwenden Sie automatisierte Tests, um zu überprüfen, ob die Abfragen korrekt sind. Mach das selbe, auch bei den Kriterienabfragen, BTW.

+0

Wenn Sie das Feld zum Vornamen umgestalten, generiert der Compiler einen Fehler oder ändert der Annotationsprozessor sofort auch 'MyEntity_.firstName' in' MyEntity_.newName', so dass ich KEINE Fehler erhalte? – MarcG

+0

Der Annotationsprozessor wird MyEntity_.firstName in MyEntity_.newName ändern, und Sie werden daher Kompilierungsfehler an allen Stellen in Ihrem Code erhalten, an dem Sie MyEntity_.firstName verwendet haben. –

+2

Ja, natürlich, da der Annotationsprozessor keinen Refactor über die IDE ausführt. Meine Güte, ich hasse diese neuen Kriterien wirklich. Wie Sie vorgeschlagen haben, fangen unsere automatisierten Tests bereits sofort Fehler bei der String-Identifizierung auf, so dass sich der Punkt nicht ändert. Lesbarkeit der alten Hibernate-Kriterien ist viel besser und das ist es, was am wichtigsten für uns ist. Danke für die Information. – MarcG