Hibernate 5 Bootstrapping API

1. Panoramica

In questo tutorial, esploreremo il nuovo meccanismo con cui possiamo inizializzare e avviare una Hibernate SessionFactory. Ci concentreremo in particolare sul nuovo processo di bootstrap nativo poiché è stato ridisegnato nella versione 5.0.

Prima della versione 5.0, le applicazioni dovevano utilizzare la classe Configuration per eseguire il bootstrap di SessionFactory. Questo approccio è ora deprecato, poiché la documentazione di Hibernate consiglia di utilizzare la nuova API basata su ServiceRegistry.

In poche parole, creare una SessionFactory significa avere un'implementazione ServiceRegistry che contiene i servizi necessari a Hibernate sia durante l'avvio che durante il runtime.

2. Dipendenze di Maven

Prima di iniziare ad esplorare il nuovo processo di bootstrap, dobbiamo aggiungere il file jar hibernate-core al classpath del progetto. In un progetto basato su Maven, dobbiamo solo dichiarare questa dipendenza nel file pom.xml :

 org.hibernate hibernate-core 5.4.0.Final 

Poiché Hibernate è un provider JPA, questo includerà anche la dipendenza API JPA in modo transitorio.

Abbiamo anche bisogno del driver JDBC del database con cui stiamo lavorando. In questo esempio, useremo un database H2 incorporato:

 com.h2database h2 1.4.197 

Sentiti libero di controllare le ultime versioni di hibernate-core e il driver H2 su Maven Central .

3. Bootstrap API

Il bootstrap si riferisce al processo di creazione e inizializzazione di una SessionFactory.

Per raggiungere questo scopo, abbiamo bisogno di un ServiceRegistry che contenga i servizi necessari a Hibernate. Da questo registro, possiamo creare un oggetto Metadati che rappresenta il modello di dominio dell'applicazione e il relativo mapping al database .

Esploriamo questi oggetti principali in maggiore dettaglio.

3.1. Servizio

Prima di addentrarsi nelle ServiceRegistry concetto, dobbiamo prima capire che cosa un servizio è . In Hibernate 5.0, un Servizio è un tipo di funzionalità rappresentato dall'interfaccia con lo stesso nome:

org.hibernate.service.Service

Per impostazione predefinita, Hibernate fornisce implementazioni per i servizi più comuni e sono sufficienti nella maggior parte dei casi. Altrimenti, possiamo creare i nostri servizi per modificare le funzionalità originali di Hibernate o aggiungerne di nuove.

Nella prossima sottosezione, mostreremo come Hibernate rende disponibili questi servizi attraverso un contenitore leggero chiamato ServiceRegistry.

3.2. ServiceRegistry

Il primo passaggio nella creazione di una SessionFactory è creare un ServiceRegistry. Ciò consente di tenere vari servizi che forniscono le funzionalità necessarie a Hibernate e si basa sulla funzionalità Java SPI.

Tecnicamente parlando, possiamo vedere ServiceRegistry come uno strumento leggero di inserimento delle dipendenze in cui i bean sono solo di tipo Service.

Esistono due tipi di ServiceRegistry e sono gerarchici . Il primo è BootstrapServiceRegistry , che non ha un genitore e contiene questi tre servizi richiesti :

  • ClassLoaderService: permette a Hibernate di interagire con il ClassLoader dei vari ambienti di runtime
  • IntegratorService: controlla il rilevamento e la gestione del servizio Integrator consentendo ad applicazioni di terze parti di integrarsi con Hibernate
  • StrategySelector: risolve le implementazioni di vari contratti di strategia

Per creare un'implementazione BootstrapServiceRegistry , utilizziamo la classe factory BootstrapServiceRegistryBuilder , che consente di personalizzare questi tre servizi in modo indipendente dai tipi:

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

Il secondo ServiceRegistry è StandardServiceRegistry , che si basa sul precedente BootstrapServiceRegistry e contiene i tre servizi menzionati sopra . Inoltre, contiene vari altri servizi necessari a Hibernate, elencati nella classe StandardServiceInitiators .

Come il registro precedente, utilizziamo StandardServiceRegistryBuilder per creare un'istanza di StandardServiceRegistry:

StandardServiceRegistryBuilder standardServiceRegistry = new StandardServiceRegistryBuilder();

Dietro le quinte, StandardServiceRegistryBuilder crea e utilizza un'istanza di BootstrapServiceRegistry. Possiamo anche usare un costruttore sovraccarico per passare un'istanza già creata:

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

We use this builder to load a configuration from a resource file, such as the default hibernate.cfg.xml, and finally, we invoke the build() method to get an instance of the StandardServiceRegistry.

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

3.3. Metadata

Having configured all the Services needed by instantiating a ServiceRegistry either of type BootstrapServiceRegistry or StandardServiceRegistry, we now need to provide the representation of the application's domain model and its database mapping.

The MetadataSources class is responsible for this:

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

Next, we get an instance of Metadata, which we'll use in the last step:

Metadata metadata = metadataSources.buildMetadata();

3.4. SessionFactory

L'ultimo passaggio consiste nel creare la SessionFactory dai metadati creati in precedenza :

SessionFactory sessionFactory = metadata.buildSessionFactory();

Ora possiamo aprire una sessione e iniziare a persistere e leggere entità:

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

4. Conclusione

In questo articolo, abbiamo esplorato i passaggi necessari per creare una SessionFactory. Sebbene il processo sembri complesso, possiamo riassumerlo in tre passaggi principali: prima abbiamo creato un'istanza di StandardServiceRegistry , poi abbiamo costruito un oggetto Metadata e infine abbiamo costruito SessionFactory.

Il codice completo per questi esempi può essere trovato su Github.