API d'amorçage Hibernate 5

1. Vue d'ensemble

Dans ce tutoriel, nous allons explorer le nouveau mécanisme par lequel nous pouvons initialiser et démarrer une SessionFactory Hibernate . Nous nous concentrerons particulièrement sur le nouveau processus d'amorçage natif tel qu'il a été repensé dans la version 5.0.

Avant la version 5.0, les applications devaient utiliser la classe Configuration pour amorcer la SessionFactory. Cette approche est désormais obsolète, car la documentation Hibernate recommande d'utiliser la nouvelle API basée sur ServiceRegistry.

En termes simples, la création d'une SessionFactory consiste à avoir une implémentation ServiceRegistry qui contient les services nécessaires à Hibernate au démarrage et à l'exécution.

2. Dépendances de Maven

Avant de commencer à explorer le nouveau processus d'amorçage, nous devons ajouter le fichier jar hibernate-core au chemin de classe du projet. Dans un projet basé sur Maven, il suffit de déclarer cette dépendance dans le fichier pom.xml :

 org.hibernate hibernate-core 5.4.0.Final 

Comme Hibernate est un fournisseur JPA, cela inclura également la dépendance de l'API JPA de manière transitoire.

Nous avons également besoin du pilote JDBC de la base de données avec laquelle nous travaillons. Dans cet exemple, nous utiliserons une base de données H2 intégrée:

 com.h2database h2 1.4.197 

N'hésitez pas à consulter les dernières versions du pilote hibernate-core et H2 sur Maven Central .

3. API d'amorçage

L'amorçage fait référence au processus de construction et d'initialisation d'une SessionFactory.

Pour atteindre cet objectif, nous avons besoin d'un ServiceRegistry qui contient les services nécessaires à Hibernate. À partir de ce registre, nous pouvons créer un objet de métadonnées qui représente le modèle de domaine de l'application et son mappage à la base de données .

Explorons ces objets majeurs plus en détail.

3.1. Un service

Avant de nous creuser dans le ServiceRegistry concept, nous devons d' abord comprendre ce qu'est un service est . Dans Hibernate 5.0, un service est un type de fonctionnalité représenté par l'interface du même nom:

org.hibernate.service.Service

Par défaut, Hibernate fournit des implémentations pour les services les plus courants , et elles sont suffisantes dans la plupart des cas. Sinon, nous pouvons créer nos propres services pour modifier les fonctionnalités Hibernate d'origine ou en ajouter de nouvelles.

Dans la sous-section suivante, nous montrerons comment Hibernate rend ces services disponibles via un conteneur léger appelé ServiceRegistry.

3.2. ServiceRegistre

La première étape de la création d'une SessionFactory consiste à créer un ServiceRegistry. Cela permet de détenir divers services qui fournissent les fonctionnalités requises par Hibernate et est basé sur la fonctionnalité Java SPI.

Techniquement parlant, nous pouvons voir le ServiceRegistry comme un outil d'injection de dépendances léger où les beans sont uniquement de type Service.

Il existe deux types de ServiceRegistry et ils sont hiérarchiques . Le premier est BootstrapServiceRegistry , qui n'a pas de parent et contient ces trois services requis :

  • ClassLoaderService: permet à Hibernate d'interagir avec le ClassLoader des différents environnements d'exécution
  • IntegratorService: contrôle la découverte et la gestion du service Integrator permettant aux applications tierces de s'intégrer à Hibernate
  • StrategySelector: résout les implémentations de divers contrats de stratégie

Pour créer une implémentation BootstrapServiceRegistry , nous utilisons la classe d'usine BootstrapServiceRegistryBuilder , qui permet de personnaliser ces trois services de manière sécurisée:

BootstrapServiceRegistry bootstrapServiceRegistry = new BootstrapServiceRegistryBuilder() .applyClassLoader() .applyIntegrator() .applyStrategySelector() .build();

Le deuxième ServiceRegistry est le StandardServiceRegistry , qui s'appuie sur le BootstrapServiceRegistry précédent et contient les trois services mentionnés ci-dessus . En outre, il contient divers autres services nécessaires à Hibernate, répertoriés dans la classe StandardServiceInitiators .

Comme le registre précédent, nous utilisons le StandardServiceRegistryBuilder pour créer une instance de StandardServiceRegistry:

StandardServiceRegistryBuilder standardServiceRegistry = new StandardServiceRegistryBuilder();

Sous le capot, StandardServiceRegistryBuilder crée et utilise une instance de BootstrapServiceRegistry. Nous pouvons également utiliser un constructeur surchargé pour passer une instance déjà créée:

BootstrapServiceRegistry bootstrapServiceRegistry = new BootstrapServiceRegistryBuilder().build(); StandardServiceRegistryBuilder standardServiceRegistryBuilder = new StandardServiceRegistryBuilder(bootstrapServiceRegistry);

Nous utilisons ce générateur pour charger une configuration à partir d'un fichier de ressources, tel que le hibernate.cfg.xml par défaut , et enfin, nous appelons la méthode build () pour obtenir une instance de StandardServiceRegistry.

StandardServiceRegistry standardServiceRegistry = standardServiceRegistryBuilder .configure() .build();

3.3. Métadonnées

Après avoir configuré tous les services nécessaires en instanciant un ServiceRegistry de type BootstrapServiceRegistry ou StandardServiceRegistry, nous devons maintenant fournir la représentation du modèle de domaine de l'application et son mappage de base de données.

La classe MetadataSources est responsable de ceci:

MetadataSources metadataSources = new MetadataSources(standardServiceRegistry); metadataSources.addAnnotatedClass(); metadataSources.addResource()

Ensuite, nous obtenons une instance de métadonnées , que nous utiliserons dans la dernière étape:

Metadata metadata = metadataSources.buildMetadata();

3.4. SessionFactory

La dernière étape consiste à créer la SessionFactory à partir des métadonnées précédemment créées :

SessionFactory sessionFactory = metadata.buildSessionFactory();

Nous pouvons maintenant ouvrir une session et commencer à persister et à lire des entités:

Session session = sessionFactory.openSession(); Movie movie = new Movie(100L); session.persist(movie); session.createQuery("FROM Movie").list();

4. Conclusion

Dans cet article, nous avons exploré les étapes nécessaires pour créer une SessionFactory. Bien que le processus semble complexe, nous pouvons le résumer en trois étapes principales: nous avons d'abord créé une instance de StandardServiceRegistry , puis nous avons construit un objet Metadata , et enfin, nous avons construit la SessionFactory.

Le code complet de ces exemples est disponible à l'adresse over sur Github.