SessionFactory contre. EntityManagerFactory
Comme je l'ai expliqué dans le Guide de l'utilisateur d'Hibernate , l'Hibernate SessionFactoryétend le JPA EntityManagerFactory, comme illustré par le diagramme suivant:

Donc, SessionFactoryc'est aussi un JPA EntityManagerFactory.
Le SessionFactoryet le EntityManagerFactorycontiennent les métadonnées de mappage d'entité et vous permettent de créer un Hibernate Sessionou un EntityManager.
Session contre. EntityManager
Tout comme le SessionFactoryet EntityManagerFactory, l'Hibernate Sessionétend le JPA EntityManager. Ainsi, toutes les méthodes définies par le EntityManagersont disponibles dans Hibernate Session.
Le Sessionet le `EntityManager traduisent les transitions d'état d'entité en instructions SQL, comme SELECT, INSERT, UPDATE et DELETE.
Hibernate vs bootstrap JPA
Lors du démarrage d'une application JPA ou Hibernate, vous avez deux choix:
- Vous pouvez démarrer via le mécanisme natif Hibernate et créer un
SessionFactoryvia le BootstrapServiceRegistryBuilder. Si vous utilisez Spring, le bootstrap Hibernate se fait via le LocalSessionFactoryBean, comme illustré par cet exemple GitHub .
- Ou, vous pouvez créer un JPA
EntityManagerFactoryvia lePersistence classe ou le EntityManagerFactoryBuilder. Si vous utilisez Spring, le bootstrap JPA se fait via le LocalContainerEntityManagerFactoryBean, comme illustré par cet exemple GitHub .
L'amorçage via JPA est à privilégier. En effet, le JPA FlushModeType.AUTOest un bien meilleur choix que l'héritage FlushMode.AUTO, ce qui rompt la cohérence de lecture-écriture pour les requêtes SQL natives .
Développer WPA pour mettre en veille prolongée
De plus, si vous démarrez via JPA et que vous avez injecté le EntityManagerFactory via l' @PersistenceUnitannotation:
@PersistenceUnit
private EntityManagerFactory entityManagerFactory;
Vous pouvez facilement accéder au sous-jacent Sessionfactory utilisant la unwrapméthode:
SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
La même chose peut être faite avec l'APP EntityManager. Si vous injectez leEntityManager via l' @PersistenceContextannotation:
@PersistenceContext
private EntityManager entityManager;
Vous pouvez facilement accéder au sous-jacent Session utilisant la unwrapméthode:
Session session = entityManager.unwrap(Session.class);
Conclusion
Par conséquent, vous devez démarrer via JPA, utiliser les symboles EntityManagerFactoryet EntityManageret les décompresser uniquement vers leurs interfaces Hibernate associées lorsque vous souhaitez accéder à certaines méthodes spécifiques à Hibernate qui ne sont pas disponibles dans JPA, comme extraire l'entité via son identifiant naturel .