Eu sou novo no Hibernate e não tenho certeza se devo usar um Hibernate SessionFactory
ou um JPA EntityManagerFactory
para criar um Hibernate Session
.
Qual é a diferença entre esses dois? Quais são os prós e os contras de usar cada um deles?
Eu sou novo no Hibernate e não tenho certeza se devo usar um Hibernate SessionFactory
ou um JPA EntityManagerFactory
para criar um Hibernate Session
.
Qual é a diferença entre esses dois? Quais são os prós e os contras de usar cada um deles?
Respostas:
Prefere
EntityManagerFactory
eEntityManager
. Eles são definidos pelo padrão JPA.SessionFactory
eSession
são específicos do hibernate. AEntityManager
invoca a sessão de hibernação sob o capô. E se você precisar de alguns recursos específicos que não estão disponíveis noEntityManager
, poderá obter a sessão chamando:fonte
Session
a partirEntityManager
, mesmo queSessionFactory.getCurrentSession()
? Quero dizer, será aberto novamenteSession
se ainda não estiver criado? Como funciona em ambiente multithread?Quero acrescentar que você também pode obter a sessão do Hibernate chamando o
getDelegate()
métodoEntityManager
.ex:
fonte
unwrap()
é para ser preferido sobregetDelegate()
acordo com os documentos java: javaee 6 , e javaee 7 .Eu prefiro a
EntityManager
API JPA2 ao invésSessionFactory
, porque parece mais moderna. Um exemplo simples:JPA:
SessionFactory:
Acho claro que o primeiro parece mais limpo e também é mais fácil de testar, porque o EntityManager pode ser facilmente ridicularizado.
fonte
return sessionFactory.getCurrentSession().createQuery("from User where id=1").list()
O uso da abordagem EntityManagerFactory nos permite usar anotações de método de retorno de chamada como @PrePersist, @ PostPersist, @ PreUpdate sem configuração extra.
Usar retornos de chamada semelhantes ao usar o SessionFactory exigirá esforços extras.
Documentos relacionados do Hibernate podem ser encontrados aqui e aqui .
Questões SOF relacionadas e discussão no Fórum da Primavera
fonte
SessionFactory
vs.EntityManagerFactory
Como expliquei no Guia do Usuário do Hibernate , o Hibernate
SessionFactory
estende o JPAEntityManagerFactory
, conforme ilustrado pelo diagrama a seguir:Portanto, o
SessionFactory
também é um JPAEntityManagerFactory
.Tanto o
SessionFactory
eoEntityManagerFactory
contêm os metadados de mapeamento entidade e permitir-lhe criar um HibernateSession
ou umEntityManager
.Session
vs.EntityManager
Assim como o
SessionFactory
eEntityManagerFactory
, o HibernateSession
estende o JPAEntityManager
. Portanto, todos os métodos definidos porEntityManager
estão disponíveis no HibernateSession
.O
Session
e o `EntityManager convertem transições de estado da entidade em instruções SQL, como SELECT, INSERT, UPDATE e DELETE.Bootstrap Hibernate vs. JPA
Ao inicializar um aplicativo JPA ou Hibernate, você tem duas opções:
SessionFactory
viaBootstrapServiceRegistryBuilder
. Se você estiver usando o Spring, a inicialização do Hibernate é feita através doLocalSessionFactoryBean
, conforme ilustrado neste exemplo do GitHub .EntityManagerFactory
através daPersistence
classe ou doEntityManagerFactoryBuilder
. Se você estiver usando o Spring, a inicialização do JPA será feita viaLocalContainerEntityManagerFactoryBean
, conforme ilustrado neste exemplo do GitHub .O bootstrapping via JPA é o preferido. Isso porque o JPA
FlushModeType.AUTO
ocorre é uma escolha muito melhor do que o legadoFlushMode.AUTO
, que quebra a consistência de leitura e gravação para consultas SQL nativas .Desembrulhando o JPA no Hibernate
Além disso, se você inicializar via JPA e tiver injetado o
EntityManagerFactory
via@PersistenceUnit
anotação:Você pode obter facilmente acesso ao subjacente
Sessionfactory
usando ounwrap
método:O mesmo pode ser feito com o JPA
EntityManager
. Se você injetar oEntityManager
via@PersistenceContext
anotação:Você pode obter facilmente acesso ao subjacente
Session
usando ounwrap
método:Conclusão
Portanto, você deve autoinicializar via JPA, usar as teclas
EntityManagerFactory
eEntityManager
, e somente desembrulhá-las nas interfaces associadas do Hibernate quando desejar obter acesso a alguns métodos específicos do Hibernate que não estão disponíveis na JPA, como buscar a entidade por meio de seu identificador natural .fonte
Ao usar o EntityManager, o código não está mais fortemente associado ao hibernate. Mas para isso, em uso, devemos usar:
ao invés de
Da mesma forma, para EntityManagerFactory, use a interface javax. Dessa forma, o código é fracamente acoplado. Se houver uma implementação JPA 2 melhor que a hibernação, a troca seria fácil. Em casos extremos, podemos digitar cast para HibernateEntityManager.
fonte
EntityManagerFactory é a implementação padrão, é a mesma em todas as implementações. Se você migrar seu ORM para qualquer outro provedor como o EclipseLink, não haverá nenhuma mudança na abordagem para lidar com a transação. Por outro lado, se você usar o factory de sessão do hibernate, ele estará vinculado às APIs do hibernate e não poderá migrar para o novo fornecedor.
fonte
A interface do EntityManager é semelhante à sessionFactory no hibernate. EntityManager no pacote javax.persistance, mas session e sessionFactory no pacote org.hibernate.Session / sessionFactory.
O gerenciador de entidades é específico para JPA e session / sessionFactory é específico para hibernação.
fonte