{"id":1134,"date":"2024-05-31T06:10:48","date_gmt":"2024-05-31T06:10:48","guid":{"rendered":"https:\/\/mozaik.ae\/de\/?post_type=blog&#038;p=1134"},"modified":"2024-05-31T06:23:51","modified_gmt":"2024-05-31T06:23:51","slug":"migration-auf-hibernate-6-4","status":"publish","type":"blog","link":"https:\/\/mozaik.ae\/de\/blog\/migration-auf-hibernate-6-4\/","title":{"rendered":"Migration auf Hibernate 6.4"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Hibernate ist ein leistungsstarker objektrelationaler Mapper (ORM), der die L\u00fccke zwischen Java-Objekten und relationalen Datenbanken schlie\u00dft. Hibernate 6 ist im Vergleich zu fr\u00fcheren Versionen ein gro\u00dfer Fortschritt. Es unterst\u00fctzt moderne JDK- und Jakarta-Spezifikationen f\u00fcr den Datenzugriff.<br>In diesem Artikel werden nicht alle Details der offiziellen Versionshinweise und Migrationsleitf\u00e4den f\u00fcr Hibernate wiederholt. Stattdessen konzentrieren wir uns auf die wichtigsten API-\u00c4nderungen, die wir kennen m\u00fcssen.<\/p>\n\n\n\n<div id=\"java-version\" class=\"wp-block-group blog-section\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\">Java Version<\/h2>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Mit Version 6.0 erwartet Hibernate ORM Java 11 als Basisversion.<\/p>\n<\/div><\/div>\n\n\n\n<section id=\"jpa\" class=\"wp-block-group blog-section\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\">JPA 2.x bis 3.0<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">JPA 3.0 \u00e4ndert das Pr\u00e4fix aller Paketnamen von API-Klassen, das Pr\u00e4fix einiger Konfigurationseigenschaften und die Schema-Namespaces f\u00fcr alle XML-basierten Konfigurationsdateien. Ziel dieser \u00c4nderungen war es, das Wort \u201eJava\u201c zu ersetzen, um rechtliche Probleme zu vermeiden.<br>Das Pr\u00e4fix der Paketnamen und Konfigurationsparameternamen \u00e4ndert sich von javax.persistence.* zu jakarta.persistence.* [1]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Da Hibernate eine Implementierung der JPA-Spezifikation ist, wechselt Hibernate 6.0 von Java Persistence, wie in den Java EE-Spezifikationen definiert, zu Jakarta Persistence, wie in den Jakarta EE-Spezifikationen definiert.[2]<\/p>\n<\/div><\/section>\n\n\n\n<section id=\"performance-improvements\" class=\"wp-block-group blog-section\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\">Einige Leistungsverbesserungen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Positionsbasierter Zugriff auf JDBC-ResultSet:<\/strong><br>Hibernate ruft Daten aus JDBC-ResultSets jetzt nach Position statt nach Namen ab. Dies vermeidet unn\u00f6tige Methodenaufrufe und verbessert m\u00f6glicherweise die Leistung.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Generiertes SQL:<\/strong><br>Hibernate kann jetzt SQL-Abfragen generieren, die Spaltenaliase auslassen und unn\u00f6tige Verkn\u00fcpfungen besser bestimmen, was auch zu Leistungsvorteilen f\u00fchren kann.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>SQM-semantisches Abfragemodell:<\/strong><br>Die Hauptidee hinter SQM besteht darin, eine einheitliche interne Darstellung sowohl f\u00fcr Criteria API als auch HQL bereitzustellen und SQL-Generierung basierend auf dieser Darstellung durchzuf\u00fchren.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>In fr\u00fcheren Hibernate-Versionen wurden Criteria-API-Aufrufe in HQL \u00fcbersetzt und dann HQL-Strings in SQL umgewandelt. Dies war ein enormer Arbeitsaufwand, der auch String-Manipulationen beinhaltete. Die Unterst\u00fctzung und Weiterentwicklung erforderte viel Arbeit.<\/li>\n\n\n\n<li>Ab Hibernate 6 werden sowohl Criteria-API-Aufrufe als auch HQL-Anweisungen in SQM \u00fcbersetzt. Anschlie\u00dfend generierte Hibernate SQL basierend auf dieser Datenstruktur. Bei der Implementierung dieser Funktion nahm das Hibernate-Team auch zwei gro\u00dfe \u00c4nderungen vor:\n<ul class=\"wp-block-list\">\n<li>Anstelle von ANTLR2 verwendet Hibernate jetzt den ANTLR4-Parser. Die neue Version bietet mehr Funktionen und hat eine bessere API.<\/li>\n\n\n\n<li>Die Hibernate-Criteria-API ist veraltet; stattdessen wird die JPA-Criteria-API verwendet. [3][4]<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/div><\/section>\n\n\n\n<section id=\"implicit-sequence\" class=\"wp-block-group blog-section\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\">Implizite Bezeichnersequenz und Tabellenname<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ab <a href=\"https:\/\/docs.jboss.org\/hibernate\/orm\/6.0\/migration-guide\/migration-guide.html#id-sequence-table-name\" title=\"Hibernate 6.0\">Hibernate 6.0<\/a> erstellt das Framework eine Sequenz f\u00fcr jede Entit\u00e4tshierarchie anstelle einer einzelnen Hibernate-Sequenz.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aufgrund dieser \u00c4nderung m\u00fcssen Benutzer, die zuvor @GeneratedValue(strategy = GenerationStrategy.AUTO) verwendet haben, sicherstellen, dass die Datenbank jetzt Sequenzen f\u00fcr jede Entit\u00e4t mit dem Namen _seq enth\u00e4lt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Standardzuordnungsgr\u00f6\u00dfe f\u00fcr solche impliziten Sequenzen hat sich ge\u00e4ndert und ist jetzt 50.<\/p>\n<\/div><\/section>\n\n\n\n<section id=\"null-comparison\" class=\"wp-block-group blog-section\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\">HQL-Nullliteralvergleich<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In fr\u00fcheren Versionen von Hibernate war es m\u00f6glich, Ausdr\u00fccke mit einem Nullliteral mit den Operatoren = und &lt;&gt;\/!= zu vergleichen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ab Hibernate 6.3 sollten wir Abfragen migrieren, um stattdessen die Pr\u00e4dikatsyntax \u201eis null\u201c und \u201eis not null\u201c zu verwenden.<\/p>\n<\/div><\/section>\n\n\n\n<section id=\"long-text-store\" class=\"wp-block-group blog-section\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\">Verbesserungen beim Speichern von Langtexten<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Wenn wir Langtext in der Datenbank speichern m\u00fcssen, k\u00f6nnten wir auf unerwartete Probleme sto\u00dfen. Beispielsweise k\u00f6nnte PostgreSQL Probleme mit Transaktionen und Suchen mit dem Operator \u201elike\u201c haben.<\/li>\n\n\n\n<li>Hibernate 6 vereinheitlicht die Definition von Langtextfeldern mithilfe der Annotation @JdbcTypeCode.<\/li>\n\n\n\n<li>@Type(type = &#8220;text&#8221;) sollte durch @JdbcTypeCode(value = SqlTypes.LONGVARCHAR) ersetzt werden, um lange Stringtypen zu definieren.<\/li>\n<\/ul>\n<\/div><\/section>\n\n\n\n<section id=\"unique-constraint\" class=\"wp-block-group blog-section\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\">UNIQUE-Beschr\u00e4nkung f\u00fcr optionale Eins-zu-eins-Zuordnungen<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Das optionale Attribut in einer Eins-zu-eins-Beziehung gibt an, dass die zugeh\u00f6rige Entit\u00e4t vorhanden sein kann oder nicht. Wenn die zugeh\u00f6rige Entit\u00e4t nicht vorhanden ist, kann die Anwendung trotzdem mit der prim\u00e4ren Entit\u00e4t arbeiten. Aus Datenbanksicht bedeutet dies normalerweise, dass Nullwerte in der Fremdschl\u00fcsselspalte zugelassen werden, die auf die zugeh\u00f6rige Entit\u00e4t verweist.<\/li>\n\n\n\n<li>Seit <a href=\"https:\/\/docs.jboss.org\/hibernate\/orm\/6.2\/migration-guide\/migration-guide.html#logical-1-1-unique\" target=\"_blank\" rel=\"noopener\" title=\"Hibernate 6.2\">Hibernate 6.2<\/a> Wenn versucht wird, einen Datensatz mit einem Wert einzuf\u00fcgen oder zu aktualisieren, der bereits in einem anderen Datensatz f\u00fcr dieselbe(n) Spalte(n) vorhanden ist, w\u00fcrde dies zu einer Verletzung der Unique-Beschr\u00e4nkung f\u00fchren!<\/li>\n<\/ul>\n<\/div><\/section>\n\n\n\n<section id=\"from-disallowed\" class=\"wp-block-group blog-section\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\">FROM ist jetzt f\u00fcr UPDATE nicht zul\u00e4ssig<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In Hibernate 5 war das optionale Schl\u00fcsselwort FROM f\u00fcr Update-Anweisungen wie<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">update from MyEntity e set e.attr = null<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Unterst\u00fctzung hierf\u00fcr wurde entfernt, um eine bessere \u00dcbereinstimmung mit JPQL zu erzielen. Entfernen Sie einfach das Schl\u00fcsselwort from aus Ihren vorhandenen Update-Anweisungen.[1]<\/p>\n<\/div><\/section>\n\n\n\n<section id=\"no-arg-constructor\" class=\"wp-block-group blog-section\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\">Standardkonstruktor ohne Argumente<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Wenn kein anderer Konstruktor definiert ist, wird zur Kompilierzeit automatisch ein Standardkonstruktor ohne Argumente bereitgestellt. Wenn wir jedoch einen parametrisierten Konstruktor definiert haben, m\u00fcssen wir auch explizit einen Standardkonstruktor bereitstellen (kann entweder \u00f6ffentlich oder gesch\u00fctzt sein).<\/li>\n\n\n\n<li>Um ein Entity-Objekt zu erstellen, muss der JPA-Anbieter einen Konstruktor ohne Argumente aufrufen. Wenn kein Konstruktor ohne Argumente vorhanden ist, f\u00fchrt dies w\u00e4hrend der Objektinstanziierung zu einer Ausnahme.[5]<\/li>\n<\/ul>\n<\/div><\/section>\n\n\n\n<section id=\"generated-value\" class=\"wp-block-group blog-section\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\">@Generated Values<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Fr\u00fchere Versionen von Hibernate ignorierten Annotationen @GeneratedValue, die auf Felder ohne Bezeichner angewendet wurden, stillschweigend.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ab Hibernate 6.4 ist diese Zuordnung nicht mehr zul\u00e4ssig und es wird eine AnnotationException ausgel\u00f6st.<\/p>\n<\/div><\/section>\n\n\n\n<section id=\"distinct\" class=\"wp-block-group blog-section\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\">DISTINCT<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">From Hibernate ORM 6, distinct is always passed to the SQL query. The returning duplicates of entities are now always filtered by Hibernate.<\/p>\n<\/div><\/section>\n\n\n\n<section id=\"deprecated-features\" class=\"wp-block-group blog-section\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\">Deprecated Features<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>hibernate.hbm2dll.create_namespaces<\/strong> ist veraltet Sie k\u00f6nnen stattdessen hibernate.hbm2ddl.create_namespaces oder jakarta.persistence.create-database-schemas verwenden.<\/li>\n\n\n\n<li>Einige Konfigurationseigenschaften, die lange Zeit veraltet waren, wurden schlie\u00dflich aus Konsistenzgr\u00fcnden entfernt. Weitere Informationen finden Sie im Migrationshandbuch.<\/li>\n<\/ul>\n<\/div><\/section>\n\n\n\n<section id=\"supported-dialects\" class=\"wp-block-group blog-section\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\">Unterst\u00fctzte Dialekte<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Werfen Sie einen Blick auf das Dokument <a href=\"https:\/\/docs.jboss.org\/hibernate\/orm\/6.4\/dialect\/dialect.html\" title=\"\u201eUnterst\u00fctzte Dialekte\u201c\">\u201eUnterst\u00fctzte Dialekte\u201c<\/a>, um zu pr\u00fcfen, ob es m\u00f6gliche Upgrades f\u00fcr die Mindestversion der Datenbanken gibt, die den Dialekten zugrunde liegen, die Hibernate derzeit unterst\u00fctzt.<\/p>\n<\/div><\/section>\n\n\n\n<section id=\"references\" class=\"wp-block-group blog-section\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\">Verweise<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/thorben-janssen.com\/migrating-jpa-2-x-to-3-0\/\" target=\"_blank\" rel=\"noopener\" title=\"\">Migrating from JPA 2.x to 3.0<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.jboss.org\/hibernate\/orm\/6.0\/migration-guide\/migration-guide.html\" target=\"_blank\" rel=\"noopener\" title=\"\">6.0 Migration Guide<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/vladmihalcea.com\/hibernate-sqm-semantic-query-model\/\" target=\"_blank\" rel=\"noreferrer noopener\">Hibernate SQM<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/jpa-buddy.com\/blog\/hibernate6-whats-new-and-why-its-important\/\" target=\"_blank\" rel=\"noopener\" title=\"\">Hibernate 6 &#8211; what&#8217;s new and why it&#8217;s important<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.baeldung.com\/jpa-no-argument-constructor-entity-class\" target=\"_blank\" rel=\"noopener\" title=\"\">Need for Default Constructor<\/a><\/li>\n<\/ol>\n<\/div><\/section>\n","protected":false},"featured_media":0,"template":"","class_list":["post-1134","blog","type-blog","status-publish","hentry"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/mozaik.ae\/de\/wp-json\/wp\/v2\/blog\/1134","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mozaik.ae\/de\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/mozaik.ae\/de\/wp-json\/wp\/v2\/types\/blog"}],"wp:attachment":[{"href":"https:\/\/mozaik.ae\/de\/wp-json\/wp\/v2\/media?parent=1134"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}