Le nom du projet a été changé de Hibernate Types à Hypersistence Utils car la portée du projet est désormais beaucoup plus large, offrant également les utilitaires Spring.
Pour cette raison, lors de la migration d'Hibernate Types 2.x vers Hypersistence Utils 3.x, vous devrez suivre ces étapes :
com.vladmihalcea.hibernate
en io.hypersistence.utils.hibernate
.com.vladmihalcea.spring
en io.hypersistence.utils.spring
.C'est ça!
Le projet Hypersistence Utils vous propose des utilitaires à usage général pour Spring et Hibernate.
Le principal avantage de ce projet est qu'il prend en charge une large gamme de versions d'Hibernate, allant de Hibernate ORM 6.6 , 6.5 , 6.4 , 6.3 à 6.2 , 6.1 , 6.0 , 5.6 et Hibernate 5.5 .
Selon la version d'Hibernate que vous utilisez, vous devez ajouter la dépendance suivante :
<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>
Le projet Hypersistence Utils définit une liste de dépendances facultatives que vous devrez déclarer explicitement dans votre projet afin de les utiliser.
La raison pour laquelle toutes ces dépendances sont facultatives, comme Guava, Jackson ou PostgreSQL JDBC Driver, est que tous les projets n'en ont pas besoin.
De plus, la version dépendante est extrêmement importante car, de temps en temps, des problèmes de sécurité peuvent être découverts et résolus dans les versions plus récentes.
Donc, compter sur cette bibliothèque pour vous fournir les versions de dépendances est une chose très dangereuse à faire.
Par exemple, 65 problèmes de sécurité ont été découverts dans la bibliothèque Jackson Data Bind sur laquelle ce projet s'appuie fortement.
Pour éviter de risquer des problèmes de sécurité, vous devez prendre la responsabilité de mettre constamment à niveau toutes les dépendances que vous utilisez avec la bibliothèque Hypersistence Utils.
Si vous utilisez des types JSON, vous pourriez être intéressé par la définition des dépendances suivantes en fonction de votre version Hibernate :
< 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 >
Si vous mappez une Range
à l'aide de Guava, vous devez fournir explicitement la dépendance Guava :
< dependency >
< groupId >com.google.guava</ groupId >
< artifactId >guava</ artifactId >
< version >${guava.version}</ version >
</ dependency >
Si vous mappez un MonetaryAmount
, vous devez alors fournir explicitement la dépendance Moneta :
< dependency >
< groupId >org.javamoney</ groupId >
< artifactId >moneta</ artifactId >
< version >${moneta.version}</ version >
< type >pom</ type >
</ dependency >
Si vous mappez un type de colonne spécifique à PostgreSQL (par exemple, inet
, hstore
, array
, interval
), alors vous devez fournir explicitement la dépendance PostgreSQL :
< dependency >
< groupId >org.postgresql</ groupId >
< artifactId >postgresql</ artifactId >
< version >${postgresql.version}</ version >
</ dependency >
Le JsonType
vous permet de mapper les types de colonnes JSON, que vous utilisiez Oracle, SQL Server, PostgreSQL ou MySQL.
Si vous utilisez Hibernate 6, vous pouvez mapper n'importe quelle colonne JSON à la propriété d'entité Map
, List
, POJO, String
ou JsonNode
:
@ Type ( JsonType . class )
private Map < String , String > properties = new HashMap <>();
Si vous utilisez Hibernate 5, vous pouvez soit fournir le nom complet du type Hibernate :
@Type(type = "io.hypersistence.utils.hibernate.type.json.JsonType")
Vous pouvez également ajouter le mappage suivant à votre classe package-info.java
dans le même package où se trouvent vos entités JPA :
@ TypeDef (
name = "json" , typeClass = JsonType . class
)
package io . hypersistence . optimizer ;
import io . hypersistence . utils . hibernate . type . json . JsonType ;
import org . hibernate . annotations . TypeDef ;
Plus tard, vous pourrez mapper les propriétés d'entité Map
, List
, POJO, String
ou JsonNode
aux colonnes JSON comme ceci :
@ Type ( type = "json" )
private Map < String , String > properties = new HashMap <>();
Pour plus de détails, consultez cet article.
Lors du mappage d'un type de colonne JSON à un
POJO
,List<POJO>
ouMap<String, POJO>
, vous devez vous assurer que le typePOJO
remplace les méthodes par défautequals
ethashCode
et les implémente en fonction du contenu de l'objet JSON.Sinon, le mécanisme de vérification sale d'Hibernate peut déclencher des instructions UPDATE inattendues. Consultez le numéro 134 pour plus de détails.
Lorsque vous utilisez Oracle, vous disposez de plusieurs options :
JsonType
générique qui peut fonctionner avec les types de colonnes JSON
, VARCHAR
ou BLOB
, à condition de donner une indication du type de colonne à l'aide de l'attribut columnDefinition
de l'annotation JPA @Column
.JsonStringType
pour mapper un type de colonne VARCHAR2
stockant JSON.JsonBlobType
pour mapper un type de colonne BLOB
stockant JSON.Pour plus de détails, consultez cet article.
Lorsque vous utilisez SQL Server, vous pouvez utiliser le JsonType
générique ou le JsonStringType
pour mapper un type de colonne NVARCHAR
stockant JSON.
Pour plus de détails, consultez cet article.
Lorsque vous utilisez PostgreSQL, vous pouvez utiliser le JsonType
générique ou le JsonBinaryType
pour mapper les types de colonnes jsonb
et json
.
Pour plus de détails, consultez cet article.
Lorsque vous utilisez MySQL, vous pouvez utiliser le JsonType
générique ou le JsonStringType
pour mapper le type de colonne json
.
Pour plus de détails, consultez cet article.
JsonNode
à une colonne JSONNo Dialect mapping for JDBC type: 1111
lors du mélange de types JSON avec des requêtes SQL nativescolumn is of type jsonb but expression is of type record
ou bytea
List
Java avec JPA et HibernateDuration
Java avec Hibernate MonetaryAmount
avec JPA et Hibernatejava.time.YearMonth
à la colonne DATE ou INTEGERjava.time.Year
et java.time.Month
avec JPA et HibernateCharacter
dans la colonne CHAR nullableImmutableType
pour simplifier les implémentations UserType
findAll
Anti-Pattern@Retry
pour réessayer automatiquement en cas d'échec Le BaseJpaRepository
est une bien meilleure alternative au Spring Data JpaRepository
par défaut car il ne fournit pas de méthode findAll
ou de méthode save
qui n'a aucun sens dans la terminologie JPA.
Pour utiliser l'utilitaire BaseJpaRepository
, assurez-vous de fournir l'attribut repositoryBaseClass
dans la configuration @EnableJpaRepositories
pour référencer le BaseJpaRepositoryImpl
du projet Hypersistence Utils :
@ Configuration
@ EnableJpaRepositories (
value = "your.repository.package" ,
repositoryBaseClass = BaseJpaRepositoryImpl . class
)
public class JpaConfiguration {
...
}
Le your.repository.package
est le package Java de vos référentiels Spring.
Bien que BaseJpaRepository
soit préférable, si vous devez utiliser le JpaRepository
par défaut, vous pouvez au moins étendre également HibernateRepository
pour déprécier les méthodes susceptibles de poser des problèmes.
Pour utiliser HibernateRepository
, assurez-vous d'inclure le package io.hypersistence.utils.spring.repository
dans votre configuration @EnableJpaRepositories
:
@ Configuration
@ EnableJpaRepositories (
value = {
"io.hypersistence.utils.spring.repository" ,
"your.repository.package" ,
...
}
)
public class JpaConfiguration {
...
}
Le your.repository.package
est le package Java de vos référentiels Spring.
BatchSequenceGenerator
- Générateur de séquences par lots Hibernate CamelCaseToSnakeCaseNamingStrategy
- Comment mapper les propriétés camelCase aux noms de colonnes Snake_case avec Hibernate ClassImportIntegrator
- Comment écrire une requête de projection DTO compacte avec JPAListResultTransformer
- La meilleure façon d'utiliser un ResultTransformer HibernateMapResultTransformer
- Comment renvoyer un résultat Map à partir d'une requête JPA ou Hibernate SQLStatementCountValidator
- Comment détecter le problème de requête Hibernate N+1 lors des tests SQLExtract
- Comment obtenir la requête SQL à partir des critères JPQL ou JPAQueryStackTraceLogger
- Comment trouver la source d'une requête SQL générée par HibernateCe projet est gratuit, comme dans Libre, pas Gratis.
Il n’y a pas d’assistance gratuite. Seuls le code source et les binaires sont disponibles gratuitement.
Si vous avez besoin d'aide pour un problème donné, vous devrez acheter le programme Coaching Basic ou Coaching Pro.
Outre les options d'assistance payantes, vous avez la possibilité de fournir votre propre correctif. Pour cela, voici ce que vous devez faire :
Cependant, par manque de temps, j'examinerai les Pull Requests soumises de temps en temps, vous devrez donc peut-être attendre plusieurs mois jusqu'à ce que la Pull Request soit examinée et intégrée.
Imaginez avoir un outil capable de détecter automatiquement si vous utilisez correctement JPA et Hibernate. Fini les problèmes de performances, plus besoin de passer d'innombrables heures à essayer de comprendre pourquoi votre application est à peine explorée.
Imaginez découvrir au début du cycle de développement que vous utilisez des mappages et des relations d'entités sous-optimaux ou qu'il vous manque des paramètres liés aux performances.
De plus, avec Hypersistence Optimizer, vous pouvez détecter tous ces problèmes lors des tests et vous assurer de ne pas déployer en production une modification qui affecterait les performances de la couche d'accès aux données.
Hypersistence Optimizer est l'outil que vous attendiez depuis longtemps !
Si une formation sur site vous intéresse, je peux vous proposer ma formation Persistence Java Haute Performance, adaptable sur une, deux ou trois journées de sessions. Pour plus de détails, consultez mon site Web.
Si vous souhaitez que j'examine votre candidature et que je vous donne un aperçu de la façon dont vous pouvez l'optimiser pour qu'elle fonctionne plus rapidement, consultez ma page de conseil.
Si vous voulez le moyen le plus rapide d'apprendre à accélérer une application de base de données Java, vous devez absolument vous inscrire à mes cours vidéo sur la persistance Java haute performance.
Ou, si vous préférez lire des livres, vous allez également adorer mon livre sur la persistance Java haute performance.
Le projet utilise Maven Toolchains car différents modules sont compilés et testés à l'aide de différentes versions Java.
Hypersistence Utils 6 nécessite Java 11 tandis que les autres modules sont compilés avec Java 8.
Pour voir comment configurer les chaînes d'outils Maven, consultez cet article.
Le projet utilise divers systèmes de base de données pour les tests d'intégration, et vous pouvez configurer les paramètres de connexion JDBC à l'aide des instances DatasourceProvider
(par exemple, PostgreSQLDataSourceProvider
), et le projet utilise Testcontainers pour amorcer un conteneur Docker avec Oracle, SQL Server, PostgreSQL ou MySQL requis. exemple sur demande.
Si vous êtes un contributeur régulier, il est conseillé de configurer localement la base de données requise ou d'utiliser la configuration Docker Compose fournie dans le dossier
docker
, car le démarrage des conteneurs à la demande est plus lent et vos tests prendront plus de temps à s'exécuter.
Si vous souhaitez résoudre un problème ou ajouter la prise en charge d'une nouvelle fonctionnalité, veuillez fournir le scénario de test d'intégration associé qui prouve que l'amélioration fonctionne comme prévu.