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, SessionFactory
c'est aussi un JPA EntityManagerFactory
.
Le SessionFactory
et le EntityManagerFactory
contiennent les métadonnées de mappage d'entité et vous permettent de créer un Hibernate Session
ou un EntityManager
.
Session
contre. EntityManager
Tout comme le SessionFactory
et EntityManagerFactory
, l'Hibernate Session
étend le JPA EntityManager
. Ainsi, toutes les méthodes définies par le EntityManager
sont disponibles dans Hibernate Session
.
Le Session
et 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
SessionFactory
via 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
EntityManagerFactory
via 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.AUTO
est 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' @PersistenceUnit
annotation:
@PersistenceUnit
private EntityManagerFactory entityManagerFactory;
Vous pouvez facilement accéder au sous-jacent Sessionfactory
utilisant la unwrap
méthode:
SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
La même chose peut être faite avec l'APP EntityManager
. Si vous injectez leEntityManager
via l' @PersistenceContext
annotation:
@PersistenceContext
private EntityManager entityManager;
Vous pouvez facilement accéder au sous-jacent Session
utilisant la unwrap
méthode:
Session session = entityManager.unwrap(Session.class);
Conclusion
Par conséquent, vous devez démarrer via JPA, utiliser les symboles EntityManagerFactory
et EntityManager
et 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 .