SessionFactory vs. EntityManagerFactory
Come ho spiegato nella Guida dell'utente di Hibernate , Hibernate SessionFactoryestende l'APP EntityManagerFactory, come illustrato dal diagramma seguente:

Quindi, SessionFactoryè anche un JPA EntityManagerFactory.
Sia il SessionFactoryche il EntityManagerFactorycontengono i metadati di mappatura dell'entità e consentono di creare un ibernazione Sessiono un EntityManager.
Session vs. EntityManager
Proprio come il SessionFactorye EntityManagerFactory, l'ibernato Sessionestende l'APP EntityManager. Quindi, tutti i metodi definiti da EntityManagersono disponibili in Hibernate Session.
Il Sessione 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
SessionFactorytramite 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
EntityManagerFactorytramite la Persistenceclasse 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 EntityManagerFactorytramite l' @PersistenceUnitannotazione:
@PersistenceUnit
private EntityManagerFactory entityManagerFactory;
Puoi facilmente accedere al sottostante Sessionfactoryusando il unwrapmetodo:
SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
Lo stesso può essere fatto con l'APP EntityManager. Se si inietta EntityManagertramite l' @PersistenceContextannotazione:
@PersistenceContext
private EntityManager entityManager;
Puoi facilmente accedere al sottostante Sessionusando il unwrapmetodo:
Session session = entityManager.unwrap(Session.class);
Conclusione
Pertanto, è necessario eseguire il bootstrap tramite JPA, utilizzare EntityManagerFactorye EntityManagere 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 .