SessionFactory
vs. EntityManagerFactory
Come ho spiegato nella Guida dell'utente di Hibernate , Hibernate SessionFactory
estende l'APP EntityManagerFactory
, come illustrato dal diagramma seguente:
Quindi, SessionFactory
è anche un JPA EntityManagerFactory
.
Sia il SessionFactory
che il EntityManagerFactory
contengono i metadati di mappatura dell'entità e consentono di creare un ibernazione Session
o un EntityManager
.
Session
vs. EntityManager
Proprio come il SessionFactory
e EntityManagerFactory
, l'ibernato Session
estende l'APP EntityManager
. Quindi, tutti i metodi definiti da EntityManager
sono disponibili in Hibernate Session
.
Il Session
e il `EntityManager traducono le transizioni dello stato dell'entità in istruzioni SQL, come SELECT, INSERT, UPDATE e DELETE.
Bootstrap Hibernate vs. JPA
Quando si avvia il bootstrap di un'applicazione JPA o Hibernate, sono disponibili due opzioni:
- È possibile eseguire il bootstrap tramite il meccanismo nativo di Hibernate e creare un
SessionFactory
tramite BootstrapServiceRegistryBuilder
. Se stai usando Spring, il bootstrap di Hibernate viene eseguito tramite LocalSessionFactoryBean
, come illustrato da questo esempio GitHub .
- In alternativa, è possibile creare un JPA
EntityManagerFactory
tramite la Persistence
classe o il EntityManagerFactoryBuilder
. Se stai usando Spring, il bootstrap JPA viene eseguito tramite LocalContainerEntityManagerFactoryBean
, come illustrato da questo esempio GitHub .
Il bootstrap tramite JPA deve essere preferito. Questo perché JPA FlushModeType.AUTO
è una scelta molto migliore rispetto all'eredità FlushMode.AUTO
, che interrompe la coerenza di lettura e scrittura per le query SQL native .
Non imballare JPA in ibernazione
Inoltre, se si avvia bootstrap tramite JPA e si è iniettato EntityManagerFactory
tramite l' @PersistenceUnit
annotazione:
@PersistenceUnit
private EntityManagerFactory entityManagerFactory;
Puoi facilmente accedere al sottostante Sessionfactory
usando il unwrap
metodo:
SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
Lo stesso può essere fatto con l'APP EntityManager
. Se si inietta EntityManager
tramite l' @PersistenceContext
annotazione:
@PersistenceContext
private EntityManager entityManager;
Puoi facilmente accedere al sottostante Session
usando il unwrap
metodo:
Session session = entityManager.unwrap(Session.class);
Conclusione
Pertanto, è necessario eseguire il bootstrap tramite JPA, utilizzare EntityManagerFactory
e EntityManager
e scartarli solo sulle interfacce Hibernate associate quando si desidera accedere ad alcuni metodi specifici di Hibernate non disponibili in JPA, come recuperare l'entità tramite il suo identificatore naturale .