API de inicialização do Hibernate 5
*1. Visão geral *
Neste tutorial, exploraremos o novo mecanismo pelo qual podemos inicializar e iniciar um Hibernate SessionFactory. Vamos nos concentrar especialmente no novo processo de inicialização nativo, como foi redesenhado na versão 5.0.
Antes da versão 5.0, os aplicativos tinham que usar a classe Configuration para inicializar o SessionFactory. Essa abordagem agora está obsoleta, pois a documentação do Hibernate recomenda o uso da nova API baseada no ServiceRegistry.
Simplificando,* construir uma SessionFactory é tudo sobre ter uma implementação ServiceRegistry que contém os Services necessários ao Hibernate *durante a inicialização e o tempo de execução.
===* 2. Dependências do Maven *
Antes de começarmos a explorar o novo processo de inicialização, precisamos adicionar o arquivo hibernate-core jar ao caminho de classe do projeto. Em um projeto baseado em Maven, apenas precisamos declarar essa dependência no arquivo pom.xml:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.0.Final</version>
</dependency>
Como o Hibernate é um provedor JPA, isso também incluirá a dependência da API JPA transitivamente.
Também precisamos do driver JDBC do banco de dados com o qual estamos trabalhando. Neste exemplo, usaremos um banco de dados H2 incorporado:
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.197</version>
</dependency>
Sinta-se à vontade para verificar as versões mais recentes de https://search.maven.org/search? Q = g: org.hibernate% 20AND% 20a: hibernate-core & core = gav [hibernate-core] _ e https://search. maven.org/search?q=g:com.h2database%20AND%20a:h2&core=gav[_H2 driver] no Maven Central .
===* 3. API de inicialização *
Bootstrapping refere-se ao processo de criação e inicialização de um SessionFactory.
*Para atingir esse objetivo, precisamos ter um _ServiceRegistry_ que contenha os _Services_ necessários ao Hibernate. Nesse registro, podemos criar um objeto _Metadata_ que representa o modelo de domínio do aplicativo e seu mapeamento para o banco de dados* .
Vamos explorar esses objetos principais em mais detalhes.
* 3.1 Serviço *
Antes de nos aprofundarmos no conceito ServiceRegistry, primeiro precisamos entender o que é um Service . No Hibernate 5.0, um Service é um tipo de funcionalidade representada pela interface com o mesmo nome:
org.hibernate.service.Service
Por padrão, o Hibernate fornece implementações para os Services mais comuns, e elas são suficientes na maioria dos casos. Caso contrário, podemos criar nossos próprios Services para modificar as funcionalidades originais do Hibernate ou adicionar novas.
Na próxima subseção, mostraremos como o Hibernate disponibiliza esses Services através de um contêiner leve chamado ServiceRegistry.
====* 3.2 ServiceRegistry *
A primeira etapa na criação de um SessionFactory é criar um ServiceRegistry. Isso permite manter vários Services que fornecem as funcionalidades necessárias ao Hibernate e se baseiam na funcionalidade https://www..com/java-spi [Java SPI].
Tecnicamente falando, podemos ver o ServiceRegistry como uma ferramenta leve de Injeção de Dependência, onde os beans são apenas do tipo Service.
Existem dois tipos de ServiceRegistry e eles são hierárquicos .* O primeiro é o BootstrapServiceRegistry, que não possui pai e mantém esses três serviços necessários *:
-
ClassLoaderService: _ permite ao Hibernate interagir com o _ClassLoader dos vários ambientes de tempo de execução
-
IntegratorService: _ controla a descoberta e o gerenciamento do serviço _Integrator, permitindo a integração de aplicativos de terceiros com o Hibernate
-
_StrategySelector: _ resolve implementações de vários contratos de estratégia
-
Para criar uma implementação BootstrapServiceRegistry, usamos a classe BootstrapServiceRegistryBuilder factory, * que permite personalizar esses três serviços de maneira segura:
BootstrapServiceRegistry bootstrapServiceRegistry = new BootstrapServiceRegistryBuilder()
.applyClassLoader()
.applyIntegrator()
.applyStrategySelector()
.build();
-
O segundo ServiceRegistry é o StandardServiceRegistry, que se baseia no BootstrapServiceRegistry anterior e mantém os três Services mencionados acima *. Além disso, contém vários outros Services necessários ao Hibernate, listados em StandardServiceInitiators.
Como no registro anterior, usamos o StandardServiceRegistryBuilder para criar uma instância do _StandardServiceRegistry: _
StandardServiceRegistryBuilder standardServiceRegistry =
new StandardServiceRegistryBuilder();
Sob o capô, o StandardServiceRegistryBuilder cria e usa uma instância de BootstrapServiceRegistry. Também podemos usar um construtor sobrecarregado para passar uma instância já criada:
BootstrapServiceRegistry bootstrapServiceRegistry =
new BootstrapServiceRegistryBuilder().build();
StandardServiceRegistryBuilder standardServiceRegistryBuilder =
new StandardServiceRegistryBuilder(bootstrapServiceRegistry);
Usamos esse construtor para carregar uma configuração de um arquivo de recurso, como o padrão hibernate.cfg.xml e, finalmente, invocamos o método build () _ para obter uma instância do _StandardServiceRegistry.
StandardServiceRegistry standardServiceRegistry = standardServiceRegistryBuilder
.configure()
.build();
====* 3.3 Metadata *
Depois de configurar todos os Services necessários instanciando um ServiceRegistry do tipo BootstrapServiceRegistry ou StandardServiceRegistry, * agora precisamos fornecer a representação do modelo de domínio do aplicativo e seu mapeamento de banco de dados. *
A classe MetadataSources é responsável por isso:
MetadataSources metadataSources = new MetadataSources(standardServiceRegistry);
metadataSources.addAnnotatedClass();
metadataSources.addResource()
Em seguida, obtemos uma instância de Metadata, que usaremos na última etapa:
Metadata metadata = metadataSources.buildMetadata();
====* 3.4 SessionFactory *
A última etapa é criar o SessionFactory a partir do _Metadata criado anteriormente: _
SessionFactory sessionFactory = metadata.buildSessionFactory();
Agora podemos abrir uma Session e começar a persistir e ler entidades:
Session session = sessionFactory.openSession();
Movie movie = new Movie(100L);
session.persist(movie);
session.createQuery("FROM Movie").list();
===* 4. Conclusão*
Neste artigo, exploramos as etapas necessárias para criar uma SessionFactory. Embora o processo pareça complexo, podemos resumir em três etapas principais: primeiro criamos uma instância de StandardServiceRegistry, depois criamos um objeto Metadata e, finalmente, criamos o SessionFactory.
O código completo desses exemplos pode ser encontrado em over no Github.