Der Projektname wurde von Hibernate Types in Hypersistence Utils geändert, da der Umfang des Projekts jetzt viel breiter ist und auch Spring-Dienstprogramme anbietet.
Aus diesem Grund müssen Sie bei der Migration von Hibernate Types 2.x zu Hypersistence Utils 3.x die folgenden Schritte ausführen:
com.vladmihalcea.hibernate
in io.hypersistence.utils.hibernate
ändern.com.vladmihalcea.spring
in io.hypersistence.utils.spring
ändern.Das ist es!
Das Hypersistence Utils-Projekt bietet Ihnen allgemeine Dienstprogramme für Spring und Hibernate.
Der Hauptvorteil dieses Projekts besteht darin, dass es eine breite Palette von Hibernate-Versionen unterstützt, die von Hibernate ORM 6.6 , 6.5 , 6.4 , 6.3 bis 6.2 , 6.1 , 6.0 , 5.6 und Hibernate 5.5 reichen.
Abhängig von der von Ihnen verwendeten Hibernate-Version müssen Sie die folgende Abhängigkeit hinzufügen:
<dependency>
<groupId>io.hypersistence</groupId>
<artifactId>hypersistence-utils-hibernate-63</artifactId>
<version>3.9.0</version>
</dependency>
<dependency>
<groupId>io.hypersistence</groupId>
<artifactId>hypersistence-utils-hibernate-62</artifactId>
<version>3.9.0</version>
</dependency>
<dependency>
<groupId>io.hypersistence</groupId>
<artifactId>hypersistence-utils-hibernate-60</artifactId>
<version>3.9.0</version>
</dependency>
<dependency>
<groupId>io.hypersistence</groupId>
<artifactId>hypersistence-utils-hibernate-55</artifactId>
<version>3.9.0</version>
</dependency>
Das Hypersistence Utils-Projekt definiert eine Liste optionaler Abhängigkeiten, die Sie in Ihrem Projekt explizit deklarieren müssen, um sie verwenden zu können.
Der Grund, warum alle diese Abhängigkeiten optional sind, wie Guava, Jackson oder der PostgreSQL-JDBC-Treiber, liegt darin, dass sie möglicherweise nicht für alle Projekte erforderlich sind.
Darüber hinaus ist die Abhängigkeitsversion äußerst wichtig, da von Zeit zu Zeit Sicherheitsprobleme entdeckt werden können, die in neueren Versionen behoben werden.
Daher ist es sehr gefährlich, sich darauf zu verlassen, dass diese Bibliothek Ihnen die Abhängigkeitsversionen liefert.
Beispielsweise wurden in der Jackson Data Bind-Bibliothek, auf die sich dieses Projekt stark verlässt, 65 Sicherheitsprobleme entdeckt.
Um das Risiko von Sicherheitsproblemen zu vermeiden, müssen Sie die Verantwortung dafür übernehmen, alle Abhängigkeiten, die Sie zusammen mit der Hypersistence Utils-Bibliothek verwenden, ständig zu aktualisieren.
Wenn Sie JSON-Typen verwenden, könnten Sie daran interessiert sein, die folgenden Abhängigkeiten basierend auf Ihrer Hibernate-Version festzulegen:
< dependency >
< groupId >com.fasterxml.jackson.module</ groupId >
< artifactId >jackson-module-jakarta-xmlbind-annotations</ artifactId >
< version >${jackson-module-jakarta-xmlbind-annotation}</ version >
</ dependency >
< dependency >
< groupId >com.fasterxml.jackson.core</ groupId >
< artifactId >jackson-databind</ artifactId >
< version >${jackson-databind.version}</ version >
</ dependency >
< dependency >
< groupId >com.fasterxml.jackson.module</ groupId >
< artifactId >jackson-module-jaxb-annotations</ artifactId >
< version >${jackson-module-jaxb-annotation}</ version >
</ dependency >
Wenn Sie einen Range
mithilfe von Guava zuordnen, müssen Sie die Guava-Abhängigkeit explizit angeben:
< dependency >
< groupId >com.google.guava</ groupId >
< artifactId >guava</ artifactId >
< version >${guava.version}</ version >
</ dependency >
Wenn Sie einen MonetaryAmount
zuordnen, müssen Sie die Moneta-Abhängigkeit explizit angeben:
< dependency >
< groupId >org.javamoney</ groupId >
< artifactId >moneta</ artifactId >
< version >${moneta.version}</ version >
< type >pom</ type >
</ dependency >
Wenn Sie einen PostgreSQL-spezifischen Spaltentyp zuordnen (z. B. inet
, hstore
, array
, interval
), müssen Sie die PostgreSQL-Abhängigkeit explizit angeben:
< dependency >
< groupId >org.postgresql</ groupId >
< artifactId >postgresql</ artifactId >
< version >${postgresql.version}</ version >
</ dependency >
Mit dem JsonType
können Sie JSON-Spaltentypen zuordnen, unabhängig davon, ob Sie Oracle, SQL Server, PostgreSQL oder MySQL verwenden.
Wenn Sie Hibernate 6 verwenden, können Sie jede JSON-Spalte der Entitätseigenschaft Map
, List
, POJO, String
oder JsonNode
zuordnen:
@ Type ( JsonType . class )
private Map < String , String > properties = new HashMap <>();
Wenn Sie Hibernate 5 verwenden, können Sie entweder den vollständig qualifizierten Namen des Hibernate-Typs angeben:
@Type(type = "io.hypersistence.utils.hibernate.type.json.JsonType")
Oder Sie können die folgende Zuordnung zu Ihrer package-info.java
Klasse in demselben Paket hinzufügen, in dem sich Ihre JPA-Entitäten befinden:
@ TypeDef (
name = "json" , typeClass = JsonType . class
)
package io . hypersistence . optimizer ;
import io . hypersistence . utils . hibernate . type . json . JsonType ;
import org . hibernate . annotations . TypeDef ;
Später können Sie die Entitätseigenschaften Map
, List
, POJO, String
oder JsonNode
JSON-Spalten wie folgt zuordnen:
@ Type ( type = "json" )
private Map < String , String > properties = new HashMap <>();
Weitere Informationen finden Sie in diesem Artikel.
Wenn Sie einen JSON-Spaltentyp einem
POJO
,List<POJO>
oderMap<String, POJO>
zuordnen, müssen Sie sicherstellen, dass derPOJO
Typ die Standardmethodenequals
undhashCode
überschreibt und sie entsprechend dem JSON-Objektinhalt implementiert.Andernfalls könnte der Hibernate-Dirty-Checking-Mechanismus unerwartete UPDATE-Anweisungen auslösen. Weitere Einzelheiten finden Sie in der Ausgabe Nr. 134.
Bei der Verwendung von Oracle haben Sie mehrere Möglichkeiten:
JsonType
verwenden, der mit den Spaltentypen JSON
, VARCHAR
oder BLOB
arbeiten kann, sofern Sie den Spaltentyp mithilfe des Attributs columnDefinition
der JPA-Annotation „ @Column
“ angeben.JsonStringType
verwenden, um einen VARCHAR2
Spaltentyp zuzuordnen, der JSON speichert.JsonBlobType
verwenden, um einen BLOB
Spaltentyp zuzuordnen, der JSON speichert.Weitere Informationen finden Sie in diesem Artikel.
Wenn Sie SQL Server verwenden, können Sie den generischen JsonType
oder den JsonStringType
verwenden, um einen NVARCHAR
Spaltentyp zuzuordnen, der JSON speichert.
Weitere Informationen finden Sie in diesem Artikel.
Wenn Sie PostgreSQL verwenden, können Sie den generischen JsonType
oder den JsonBinaryType
verwenden, um sowohl jsonb
als auch json
Spaltentypen zuzuordnen.
Weitere Informationen finden Sie in diesem Artikel.
Wenn Sie MySQL verwenden, können Sie den generischen JsonType
oder den JsonStringType
verwenden, um den json
Spaltentyp zuzuordnen.
Weitere Informationen finden Sie in diesem Artikel.
JsonNode
einer JSON-Spalte zuNo Dialect mapping for JDBC type: 1111
beim Mischen von JSON-Typen mit nativen SQL-Abfragencolumn is of type jsonb but expression is of type record
oder bytea
List
mit JPA und Hibernate zuDuration
zu MonetaryAmount
mit JPA und Hibernate abzubildenjava.time.YearMonth
der Spalte DATE oder INTEGER zujava.time.Year
und java.time.Month
mit JPA und Hibernate zuCharacter
in nullbare CHAR-SpalteImmutableType
Dienstprogramm zur Vereinfachung UserType
Implementierungen findAll
Anti-Pattern@Retry
für einen automatischen Wiederholungsversuch bei einem Fehler Das BaseJpaRepository
ist eine viel bessere Alternative zum standardmäßigen Spring Data JpaRepository
da es keine findAll
-Methode oder eine save
-Methode bereitstellt, die in der JPA-Terminologie keinen Sinn ergibt.
Um das BaseJpaRepository
Dienstprogramm zu verwenden, stellen Sie sicher, dass Sie das Attribut repositoryBaseClass
in der @EnableJpaRepositories
-Konfiguration bereitstellen, um auf BaseJpaRepositoryImpl
aus dem Hypersistence Utils-Projekt zu verweisen:
@ Configuration
@ EnableJpaRepositories (
value = "your.repository.package" ,
repositoryBaseClass = BaseJpaRepositoryImpl . class
)
public class JpaConfiguration {
...
}
Das your.repository.package
ist das Java-Paket Ihrer Spring-Repositorys.
Während das BaseJpaRepository
zu bevorzugen ist, können Sie für den Fall, dass Sie das Standard JpaRepository
verwenden müssen, zumindest auch das HibernateRepository
erweitern, um die Methoden zu verwerfen, die Probleme verursachen können.
Um das HibernateRepository
zu verwenden, stellen Sie sicher, dass Sie das Paket io.hypersistence.utils.spring.repository
in Ihre @EnableJpaRepositories
-Konfiguration einschließen:
@ Configuration
@ EnableJpaRepositories (
value = {
"io.hypersistence.utils.spring.repository" ,
"your.repository.package" ,
...
}
)
public class JpaConfiguration {
...
}
Das your.repository.package
ist das Java-Paket Ihrer Spring-Repositorys.
BatchSequenceGenerator
– Batch-Sequenzgenerator im Ruhezustand CamelCaseToSnakeCaseNamingStrategy
– So ordnen Sie CamelCase-Eigenschaften mit Hibernate den Namen von Snake_Case-Spalten zu ClassImportIntegrator
– So schreiben Sie eine kompakte DTO-Projektionsabfrage mit JPAListResultTransformer
– Die beste Möglichkeit, einen Hibernate ResultTransformer zu verwendenMapResultTransformer
– So geben Sie ein Kartenergebnis aus einer JPA- oder Hibernate-Abfrage zurück SQLStatementCountValidator
– So erkennen Sie das Hibernate N+1-Abfrageproblem während des Tests SQLExtract
– So erhalten Sie die SQL-Abfrage von JPQL oder JPA CriteriaQueryStackTraceLogger
– So finden Sie die Quelle einer von Hibernate generierten SQL-AbfrageDieses Projekt ist im Sinne von Libre kostenlos, nicht Gratis.
Es gibt keinen kostenlosen Support. Lediglich der Quellcode und die Binärdateien sind kostenlos verfügbar.
Wenn Sie Hilfe bei einem bestimmten Problem benötigen, müssen Sie entweder das Coaching Basic- oder das Coaching Pro-Programm erwerben.
Neben den kostenpflichtigen Supportoptionen haben Sie die Möglichkeit, Ihren eigenen Fix bereitzustellen. Dazu müssen Sie Folgendes tun:
Aufgrund von Zeitmangel werde ich die eingereichten Pull-Requests jedoch von Zeit zu Zeit überprüfen, sodass Sie möglicherweise mehrere Monate warten müssen, bis der Pull-Request überprüft und integriert ist.
Stellen Sie sich vor, Sie hätten ein Tool, das automatisch erkennt, ob Sie JPA und Hibernate richtig verwenden. Keine Leistungsprobleme mehr und Sie müssen nicht mehr unzählige Stunden damit verbringen, herauszufinden, warum Ihre Anwendung kaum crawlt.
Stellen Sie sich vor, Sie stellen zu Beginn des Entwicklungszyklus fest, dass Sie nicht optimale Zuordnungen und Entitätsbeziehungen verwenden oder dass leistungsbezogene Einstellungen fehlen.
Darüber hinaus können Sie mit Hypersistence Optimizer alle derartigen Probleme während des Tests erkennen und sicherstellen, dass Sie keine Änderung in der Produktion bereitstellen, die sich auf die Leistung der Datenzugriffsebene auswirkt.
Hypersistence Optimizer ist das Tool, auf das Sie lange gewartet haben!
Wenn Sie Interesse an einer Schulung vor Ort haben, kann ich Ihnen mein High-Performance Java Persistence Training anbieten, das auf ein-, zwei- oder dreitägige Sitzungen angepasst werden kann. Weitere Informationen finden Sie auf meiner Website.
Wenn Sie möchten, dass ich Ihre Anwendung überprüfe und Ihnen Einblicke gebe, wie Sie sie optimieren können, damit sie schneller läuft, dann schauen Sie sich meine Beratungsseite an.
Wenn Sie am schnellsten lernen möchten, wie Sie eine Java-Datenbankanwendung beschleunigen können, sollten Sie sich unbedingt für meine Videokurse zur Hochleistungs-Java-Persistenz anmelden.
Wenn Sie lieber Bücher lesen, wird Ihnen auch mein Buch „High-Performance Java Persistence“ gefallen.
Das Projekt nutzt Maven Toolchains, da verschiedene Module mit unterschiedlichen Java-Versionen kompiliert und getestet werden.
Hypersistence Utils 6 erfordert Java 11, während die anderen Module mit Java 8 kompiliert werden.
Um zu erfahren, wie Sie Maven Toolchains konfigurieren, lesen Sie diesen Artikel.
Das Projekt verwendet verschiedene Datenbanksysteme für Integrationstests, und Sie können die JDBC-Verbindungseinstellungen mithilfe der DatasourceProvider
Instanzen (z. B. PostgreSQLDataSourceProvider
) konfigurieren. Außerdem verwendet das Projekt Testcontainer, um einen Docker-Container mit dem erforderlichen Oracle, SQL Server, PostgreSQL oder MySQL zu booten Instanz auf Anfrage.
Wenn Sie regelmäßig Beiträge leisten, empfiehlt es sich, die erforderliche Datenbank lokal einzurichten oder die im
docker
Ordner bereitgestellte Docker Compose-Konfiguration zu verwenden, da das Bootstrapping der Container bei Bedarf langsamer ist und die Ausführung Ihrer Tests länger dauert.
Wenn Sie ein Problem beheben oder Unterstützung für eine neue Funktion hinzufügen möchten, stellen Sie bitte den zugehörigen Integrationstestfall bereit, der beweist, dass die Verbesserung wie erwartet funktioniert.