Hibernate 5 Bootstrapping API

1. Oversigt

I denne vejledning undersøger vi den nye mekanisme, hvormed vi kan initialisere og starte en dvale SessionFactory. Vi fokuserer især på den nye native bootstrapping-proces, da den blev redesignet i version 5.0.

Før version 5.0 skulle applikationer bruge Konfiguration klasse til bootstrap SessionFactory. Denne tilgang er nu udfaset, da Hibernate-dokumentationen anbefaler, at du bruger den nye API baseret på ServiceRegistry.

Kort fortalt, bygning en SessionFactory handler om at have en ServiceRegistry implementering, der holder Tjenester behov for dvale under både opstart og runtime.

2. Maven-afhængigheder

Før vi begynder at udforske den nye bootstrapping-proces, skal vi tilføje dvale-kerne jar-fil til projektets klassesti. I et Maven-baseret projekt er vi bare nødt til at erklære denne afhængighed i pom.xml fil:

 org. dvale-dvale-core 5.4.0.Final 

Da Hibernate er en JPA-udbyder, vil dette også omfatte JPA API-afhængighed transitivt.

Vi har også brug for JDBC-driveren til den database, som vi arbejder med. I dette eksempel bruger vi en indbygget H2-database:

 com.h2database h2 1.4.197 

Du er velkommen til at tjekke de nyeste versioner af dvale-kerne og H2-driver på Maven Central.

3. Bootstrapping API

Bootstrapping refererer til processen med at opbygge og initialisere en SessionFactory.

For at nå dette formål skal vi have en ServiceRegistry der holder Tjenester behov for dvale. Fra dette register kan vi oprette en Metadata objekt, der repræsenterer applikationens domænemodel og dets tilknytning til databasen.

Lad os udforske disse større objekter mere detaljeret.

3.1. Service

Før vi graver ind i ServiceRegistry koncept, skal vi først forstå, hvad en Service er. I dvaletilstand 5.0, a Service er en type funktionalitet, der er repræsenteret af grænsefladen med samme navn:

org.hibernate.service.Service

Hibernate tilbyder som standard implementeringer for de mest almindelige Tjenester, og de er tilstrækkelige i de fleste tilfælde. Ellers kan vi bygge vores egne Tjenester for enten at ændre de originale dvale-funktioner eller tilføje nye.

I det næste underafsnit viser vi, hvordan Dvale gør disse Tjenester tilgængelig gennem en letvægtsbeholder kaldet ServiceRegistry.

3.2. ServiceRegistry

Det første trin i opbygningen af ​​en SessionFactory er at oprette en ServiceRegistry. Dette giver mulighed for at holde forskellige Tjenester der giver funktionaliteter, der er nødvendige i dvale, og er baseret på Java SPI-funktionaliteten.

Teknisk set kan vi se ServiceRegistry som et letvægtsafhængighedsinjektionsværktøj, hvor bønner kun er af typen Service.

Der er to typer ServiceRegistry og de er hierarkiske.Den første er BootstrapServiceRegistry, som ikke har nogen forælder og besidder disse tre nødvendige tjenester:

  • ClassLoaderService: gør det muligt for dvale at interagere med ClassLoader af de forskellige runtime-miljøer
  • IntegratorService: styrer opdagelsen og styringen af Integrator tjeneste, der gør det muligt for tredjepartsapplikationer at integrere med dvaletilstand
  • StrategiVælger: løser implementeringer af forskellige strategikontrakter

At bygge en BootstrapServiceRegistry implementering bruger vi BootstrapServiceRegistryBuilder fabriksklasse, som gør det muligt at tilpasse disse tre tjenester på en typesikker måde:

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

Sekundet ServiceRegistry er StandardServiceRegistry, som bygger på den foregående BootstrapServiceRegistry og holder de tre Tjenester nævnt ovenfor. Derudover indeholder den forskellige andre Tjenester behov for dvale, anført i StandardServiceInitiators klasse.

Ligesom det forrige register bruger vi StandardServiceRegistryBuilder for at oprette en forekomst af StandardServiceRegistry:

StandardServiceRegistryBuilder standardServiceRegistry = ny StandardServiceRegistryBuilder ();

Under hætten, den StandardServiceRegistryBuilder opretter og bruger en forekomst af BootstrapServiceRegistry. Vi kan også bruge en overbelastet konstruktør til at passere en allerede oprettet instans:

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

Vi bruger denne builder til at indlæse en konfiguration fra en ressourcefil, f.eks. Standard hibernate.cfg.xml, og til sidst påberåber vi os bygge () metode til at få en forekomst af StandardServiceRegistry.

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

3.3. Metadata

Efter at have konfigureret alle Tjenester nødvendigt ved at starte en ServiceRegistry begge typer BootstrapServiceRegistry eller StandardServiceRegistry, Vi har nu brug for at give en repræsentation af applikationens domænemodel og dets databasekortlægning.

Det MetadataSources klasse er ansvarlig for dette:

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

Dernæst får vi en forekomst af Metadata, som vi bruger i det sidste trin:

Metadata metadata = metadataSources.buildMetadata ();

3.4. SessionFactory

Det sidste trin er at oprette SessionFactory fra det tidligere oprettede Metadata:

SessionFactory sessionFactory = metadata.buildSessionFactory ();

Vi kan nu åbne en Session og start vedholdende og læse enheder:

Session session = sessionFactory.openSession (); Filmfilm = ny film (100L); session.persist (film); session.createQuery ("FROM Movie"). liste ();

4. Konklusion

I denne artikel undersøgte vi de nødvendige trin til at opbygge en SessionFactory. Selvom processen virker kompleks, kan vi sammenfatte den i tre hovedtrin: vi oprettede først en forekomst af StandardServiceRegistry, så byggede vi en Metadata objekt, og til sidst byggede vi SessionFactory.

Den fulde kode for disse eksempler findes på Github.


$config[zx-auto] not found$config[zx-overlay] not found