web-dev-qa-db-fra.com

Quoi de neuf dans Hibernate ORM 5?

Je viens de voir que le 4ème candidat est sorti pour Hibernate 5. Quoi de neuf dans 5 par rapport aux versions précédentes?

51
Shri S Softwares

Certaines fonctionnalités intéressantes ont été ajoutées/améliorées dans Hibernate 5.x. Jetez un coup d'oeil.

1. Recherche Hibernate

Hibernate Search indexe de manière transparente vos objets et offre une recherche rapide, régulière, en texte intégral et géolocalisation. La facilité d'utilisation et la facilité de mise en cluster sont essentielles.

  • Recherche en texte intégral des entités - recherche par approximation (recherche floue)
  • Cluster-friendly - offre plusieurs stratégies de cluster faciles à configurer
  • Facettage et géolocalisation - Les entités géolocalisées sont aussi simples que @Spatial

Pour plus de détails sur la recherche Hibernate, voir ceci.

2. Validateur Hibernate

Hibernate Validator est livré avec une poignée de règles de validation intégrées telles que Email, Longueur, NotBlank, etc.

Exprimez les règles de validation de manière normalisée à l'aide de contraintes basées sur des annotations et bénéficiez d'une intégration transparente avec une grande variété de cadres.

Pour plus de détails sur Hibernate Validator, voyez ceci.

3. Support amélioré Java 8

Les types de données date/heure Java 8 (JSR 310) sont pris en charge et peuvent être validés via @Past et @Future. De plus, les types facultatifs et JavaFX sont pris en charge via un ValidatedValueUnwrapper amélioré.

4. OGM d'Hibernate

Vient de paraître la première version stable.

5. API d'amorçage

Nouvelle API d'amorçage - meilleur déterminisme, meilleure intégration


Quelques autres choses:

  • Prise en charge de l'analyse pour une utilisation autre que JPA
  • NamingStrategy a été supprimé au profit d'une API mieux conçue
  • Possibilité de gérer des types supplémentaires Java pour les attributs id identifiés en tant que GenerationType # AUTO. Prise en charge intégrée de Number et UUID. Extensible via la nouvelle extension org.hibernate.boot.model.IdGeneratorStrategyInterpreter.
  • De plus, le support pour AttributeConverters a été étendu et plus pleinement réalisé

Consultez feuille de route Hibernate ORM pour plus de détails.

46
Bacteria

Il y a une longue liste de choses qui ont été modifiées dans Hibernate 5:

  1. Nouvelle bootstrap afin que nous puissions amorcer un environnement JPA par programmation sans avoir besoin d'un fichier persistence.xml .

  2. À partir de la version 5.0, Hibernate Spatial fait partie du projet Hibernate. Nous pouvons également gérer les données SIG.

  3. Les types de date et heure Java 8 sont pris en charge dans les mappages de modèles de domaine. Le mappage entre les types Date/Heure SQL standard et les types de classe pris en charge Java 8) se présente comme suit;

    • DATE: Java.time.LocalDate
    • TEMPS: Java.time.LocalTime, Java.time.OffsetTime
    • TIMESTAMP: Java.time.Instant, Java.time.LocalDateTime, Java.time.OffsetDateTime Et Java.time.ZonedDateTime
  4. Le mécanisme d'amélioration du bytecode a été entièrement repensé, et Hibernate propose à la fois un plugin Maven et un plugin Gradle. Il existe trois aspects principaux que nous pouvons améliorer avec l’instrumentation bytecode:

    • Initialisation différée: les champs peuvent être déclarés en tant que LAZY et ils ne seront récupérés que lors de leur premier accès.

    • Vérification sale: les entités sont améliorées pour pouvoir garder une trace de toutes les propriétés modifiées après le chargement dans un contexte de persistance.

    • Associations bidirectionnelles: Il est possible de synchroniser automatiquement les deux côtés d'une association bidirectionnelle, même si le développeur ne met à jour qu'un seul côté.

  5. Les API natives d'Hibernate (Session, etc.) ont été mises à jour pour utiliser des types génériques. Pas besoin de lancer lors de la récupération des entités.

  6. Hibernate 5.0 étend cela à un ensemble plus large de types (par exemple, UUID).

  7. Cache de second niveau par référence. Cette fonctionnalité permet le stockage direct des références d'entité dans le cache de deuxième niveau pour les entités immuables.

  8. Depuis Hibernate 5.0, nous avons un nouveau Guide de l’utilisateur qui a été écrit à partir de zéro.

Hibernate 5.1 ajoute les fonctionnalités suivantes:

  1. Vous pouvez maintenant rejoindre des entités non liées dans les requêtes JPQL et HQL
  2. charge multi-entités par identififer

Hibernate 5.2 ajoute le support pour:

  1. Java 1.8, donc vous pouvez maintenant utiliser Query.stream()
  2. Hibernate Session étend EntityManager afin que vous puissiez accéder à toutes les méthodes JPA directement à partir d'un Session
  3. Prise en charge de JCache
  4. Taille du lot au niveau de la session
  5. Paramètre de fuseau horaire global (par exemple, UTC) pour Timestamp et Time
  6. indice de passage distinct
  7. Analyse plus efficace en JPQL et HQL de valeurs constantes
  8. L'optimisation de la transaction hibernate.connection.provider_disables_autocommit Ressource-locale .
  9. Meilleure gestion des littéraux de l'API Criteria .
42
Vlad Mihalcea

Il y a 5 nouvelles fonctionnalités dans Hibernate 5

1. Classes de support de l'API Date et heure en tant que BasicTypes La nouvelle API Date et heure est l'un des changements les plus attendus dans Java 8. L'ancien Java.util .Date a beaucoup de problèmes qui ont finalement été résolus.

Malheureusement, JPA 2.1 et Hibernate 4 ne lui fournissent pas de support direct. Mais ce n’est pas un gros problème. Quelques lignes de code suffisent pour implémenter un AttributeConverter qui mappe un LocalDate.

Mais évidemment, le support explicite en tant que BasicType est encore bien meilleur. Hibernate a implémenté cela dans la version 5.0. Depuis lors, vous n'avez pas besoin d'annotations ni de convertisseurs supplémentaires pour conserver les classes de l'API Date et heure. Vous pouvez les utiliser de la même manière que tout autre type d'attribut pris en charge.

2. Obtenir les résultats d'une requête sous forme de flux L'introduction d'une nouvelle méthode pour vous donner le résultat de votre requête sous forme de flux ne semble pas être une grosse affaire. Mais la méthode de flux de l’interface de requête de Hibernate offre un avantage supplémentaire qui la rend particulièrement intéressante pour les jeux de résultats énormes. Il extrait le jeu de résultats en plusieurs lots et utilise l’implémentation ScrollableResults d’Hibernate pour le faire défiler. Cette approche convient parfaitement si vous utilisez un flux pour traiter les enregistrements de jeu de résultats un par un et vous aide à implémenter efficacement votre cas d'utilisation.

Vous pouvez utiliser la nouvelle méthode depuis Hibernate 5.2 pour obtenir les résultats de votre requête. L'extrait de code suivant montre un exemple simple qui sélectionne toutes les entités du livre dans la base de données et les traite en tant que flux.

3. Récupérer plusieurs entités par leur clé primaire

Extraire plusieurs entités par leur ID est un cas d'utilisation très courant. La plupart des développeurs l'implémentent avec une boucle qui appelle la méthode find du EntityManager pour chaque clé primaire ou avec une requête JPQL qui vérifie toutes les valeurs de clé primaire dans une clause IN. La première option nécessite qu'Hibernate effectue une requête de base de données pour chaque clé primaire. Cela peut créer d’énormes problèmes de performances. La seconde vous permet de récupérer toutes les entités avec une requête et est évidemment la meilleure option.

Hibernate 5.1 a introduit une troisième option qui évite les problèmes de la première et est plus facile à utiliser que la seconde. La nouvelle interface MultiIdentifierLoadAccess offre une option confortable pour charger plusieurs entités avec une requête. Il vous suffit d'appeler la méthode byMultipleIds sur la session Hibernate pour obtenir une interface MultiIdentifierLoadAccess et fournir une liste des valeurs de clé primaire à la méthode multiLoad. La mise en œuvre d’Hibernate offre également un avantage supplémentaire: elle divise d’énormes listes de valeurs de clé primaire en plusieurs lots. Cela est parfois nécessaire car certaines bases de données limitent le nombre d'éléments dans une clause IN.

4. Joindre des entités non associées dans une requête

Vous pouvez facilement joindre des associations mappées entre des entités dans des requêtes JPQL. Le mappage fournit déjà les conditions de jointure requises et vous n'avez pas besoin de les fournir dans votre requête.

Mais qu'en est-il des entités qui mappent des tables de base de données associées mais n'ont aucune association mappée?

Et ce n’est pas une question rhétorique.

La plupart des modèles d'entité ne mappent pas toutes les associations possibles. Ils ne mappent que ceux qui semblent apporter de la valeur au modèle de domaine et non ceux où 2 tables de base de données (apparemment accidentelles) stockent la même clé étrangère. Il arrive aussi très souvent qu’une association multiple avec beaucoup d’enregistrements ne soit pas mappée avec Hibernate. Le risque que quelqu'un appelle le getter de l'association et récupère plusieurs centaines ou milliers d'entités est tout simplement trop élevé.

C’est tout à fait correct tant que vous ne regardez que le modèle de domaine. Vous n’avez probablement pas besoin de ces associations dans le modèle. Mais cela ne signifie pas que vous n’en avez pas besoin dans l’une de vos requêtes JPQL.

Si tel est le cas, vous avez 3 options:

1 Modéliser l’association entre les entités ou
2 Utilisez une jointure croisée dans votre requête JPQL qui pourrait créer des problèmes de performances ou
3 Utilisez la clause JOIN exclusive de Hibernate. Je préfère l’option 3. C’est la plus simple et la plus naturelle.

Depuis Hibernate 5.1, vous pouvez utiliser une syntaxe semblable à SQL pour joindre des entités sans association modélisée.

5. @Repeatable annotations

Les annotations répétables sont l’un des plus petits changements de Java 8.). Il vous permet d’annoter plusieurs fois une classe, un attribut ou une interface avec la même annotation. Un exemple typique de JPA dans lequel vous souhaitez le faire. définit plusieurs requêtes nommées pour une entité.

Jusqu'à présent, vous deviez annoter votre entité avec une annotation @NamedQueries contenant un tableau d'annotations @NamedQuery. L'ennui, c'est que l'annotation @NamedQueries n'est qu'un conteneur. Il ne fournit aucune valeur en soi. Depuis Hibernate 5.2, vous n’êtes plus obligé de le faire. Du moins pas tant que vous utilisez la version Hibernate de l’annotation org.hibernate.annotations.NamedQuery. @NamedQuery et beaucoup d'autres annotations Hibernate sont désormais reproductibles et peuvent être attribués plusieurs fois. Comme vous pouvez le constater dans l'extrait de code suivant, cela rend le code plus facile à lire et beaucoup plus confortable à utiliser.

Creadit/Source : https://www.whilets-on-Java.org/5-new-features-hibernate-5- chaque-développeur-sais /

2
Vijay Barot