Slaapstand 5 Bootstrapping-API

1. Overzicht

In deze tutorial verkennen we het nieuwe mechanisme waarmee we een Hibernate kunnen initialiseren en starten SessionFactory. We zullen ons vooral concentreren op het nieuwe native bootstrapping-proces zoals het opnieuw is ontworpen in versie 5.0.

Vóór versie 5.0 moesten applicaties de Configuratie class om het SessionFactory. Deze benadering is nu verouderd, aangezien de Hibernate-documentatie aanbeveelt om de nieuwe API te gebruiken op basis van de ServiceRegistry.

Simpel gezegd, een .... bouwen SessionFactory gaat allemaal over het hebben van een ServiceRegistry implementatie die de Diensten nodig door Hibernate zowel tijdens het opstarten als tijdens runtime.

2. Maven afhankelijkheden

Voordat we het nieuwe bootstrapping-proces gaan verkennen, moeten we het slaapstand-core jar-bestand naar het klassenpad van het project. In een op Maven gebaseerd project hoeven we deze afhankelijkheid alleen maar in het pom.xml het dossier:

 org.hibernate hibernate-core 5.4.0.Final 

Aangezien Hibernate een JPA-provider is, omvat dit ook tijdelijk de JPA API-afhankelijkheid.

We hebben ook het JDBC-stuurprogramma nodig van de database waarmee we werken. In dit voorbeeld gebruiken we een ingesloten H2-database:

 com.h2database h2 1.4.197 

Bekijk gerust de laatste versies van slaapstand-core en H2-stuurprogramma op Maven Central.

3. Bootstrapping-API

Bootstrapping verwijst naar het proces van het bouwen en initialiseren van een SessionFactory.

Om dit doel te bereiken, hebben we een ServiceRegistry dat bevat de Diensten nodig door Hibernate. Vanuit dit register kunnen we een Metadata object dat het domeinmodel van de toepassing en de toewijzing ervan aan de database vertegenwoordigt.

Laten we deze belangrijke objecten in meer detail onderzoeken.

3.1. Onderhoud

Voordat we ingaan op het ServiceRegistry concept, moeten we eerst begrijpen wat een Onderhoud is. In Hibernate 5.0 is een Onderhoud is een type functionaliteit vertegenwoordigd door de interface met dezelfde naam:

org.hibernate.service.Service

Hibernate biedt standaard implementaties voor de meest voorkomende Diensten, en ze zijn in de meeste gevallen voldoende. Anders kunnen we onze eigen bouwen Diensten om de oorspronkelijke Hibernate-functies te wijzigen of nieuwe toe te voegen.

In de volgende subsectie laten we zien hoe Hibernate deze maakt Diensten verkrijgbaar via een lichtgewicht container genaamd ServiceRegistry.

3.2. ServiceRegistry

De eerste stap bij het bouwen van een SessionFactory is om een ServiceRegistry. Dit maakt het mogelijk verschillende vast te houden Diensten die functionaliteiten bieden die nodig zijn voor Hibernate en is gebaseerd op de Java SPI-functionaliteit.

Technisch gezien kunnen we de ServiceRegistry als een lichtgewicht Dependency Injection-tool waar bonen alleen van het type zijn Onderhoud.

Er zijn twee soorten ServiceRegistry en ze zijn hiërarchisch.De eerste is de BootstrapServiceRegistry, die geen ouder heeft en deze drie vereiste services bezit:

  • ClassLoaderService: stelt Hibernate in staat om te communiceren met het ClassLoader van de verschillende runtime-omgevingen
  • IntegratorService: regelt de ontdekking en het beheer van de Integrator service waarmee toepassingen van derden kunnen worden geïntegreerd met Hibernate
  • StrategieSelector: lost implementaties van diverse strategiecontracten op

Om een BootstrapServiceRegistry implementatie gebruiken we de BootstrapServiceRegistryBuilder fabrieksklasse, waarmee deze drie services op een typeveilige manier kunnen worden aangepast:

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

De seconde ServiceRegistry is de StandardServiceRegistry, dat voortbouwt op het vorige BootstrapServiceRegistry en houdt de drie vast Diensten hierboven genoemd. Bovendien bevat het verschillende andere Diensten nodig door Hibernate, vermeld in het StandardServiceInitiators klasse.

Net als het vorige register gebruiken we de StandardServiceRegistryBuilder om een ​​instantie van het StandardServiceRegistry:

StandardServiceRegistryBuilder standardServiceRegistry = nieuwe StandardServiceRegistryBuilder ();

Onder de motorkap, de StandardServiceRegistryBuilder maakt en gebruikt een instantie van BootstrapServiceRegistry. We kunnen ook een overbelaste constructor gebruiken om een ​​reeds aangemaakte instantie door te geven:

BootstrapServiceRegistry bootstrapServiceRegistry = nieuwe BootstrapServiceRegistryBuilder (). Build (); StandardServiceRegistryBuilder standardServiceRegistryBuilder = nieuwe StandardServiceRegistryBuilder (bootstrapServiceRegistry);

We gebruiken deze builder om een ​​configuratie uit een bronbestand te laden, zoals de standaard slaapstand.cfg.xml, en tot slot doen we beroep op de bouwen() methode om een ​​instantie van de StandardServiceRegistry.

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

3.3. Metadata

Nadat alle Diensten nodig door het instantiëren van een ServiceRegistry beide van het type BootstrapServiceRegistry of StandardServiceRegistry, we moeten nu de representatie van het domeinmodel van de applicatie en de databasetoewijzing geven.

De Metadata Bronnen klasse is hiervoor verantwoordelijk:

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

Vervolgens krijgen we een exemplaar van Metadata, die we zullen gebruiken in de laatste stap:

Metadata metadata = metadataSources.buildMetadata ();

3.4. SessionFactory

De laatste stap is het maken van het SessionFactory van het eerder gemaakte Metadata:

SessionFactory sessionFactory = metadata.buildSessionFactory ();

We kunnen nu een Sessie en begin met het doorzetten en lezen van entiteiten:

Sessiesessie = sessionFactory.openSession (); Movie movie = nieuwe film (100L); session.persist (filmpje); session.createQuery ("FROM Movie"). list ();

4. Conclusie

In dit artikel hebben we de stappen onderzocht die nodig zijn om een SessionFactory. Hoewel het proces complex lijkt, kunnen we het samenvatten in drie grote stappen: we hebben eerst een instantie gemaakt van StandardServiceRegistry, dan hebben we een Metadata object, en ten slotte hebben we het SessionFactory.

De volledige code voor deze voorbeelden is te vinden op Github.