SessionFactory
vs. EntityManagerFactory
Comme je l'ai expliqué dans le Guide de l'utilisateur d'Hibernate l'Hibernate SessionFactory
étend l'interface JPA EntityManagerFactory
comme l'illustre le schéma suivant :
Donc, le SessionFactory
est également un JPA EntityManagerFactory
.
Les deux SessionFactory
y el EntityManagerFactory
contiennent les métadonnées de mappage d'entités et vous permettent de créer un fichier Hibernate Session
ou un EntityManager
.
Session
vs. EntityManager
Tout comme le SessionFactory
y EntityManagerFactory
l'Hibernate Session
étend l'interface JPA EntityManager
. Ainsi, toutes les méthodes définies par le EntityManager
sont disponibles dans la base de données Hibernate Session
.
El Session
et le `EntityManager traduire les transitions d'état des entités dans les instructions SQL, comme SELECT, INSERT, UPDATE et DELETE.
Hibernate vs. JPA bootstrap
Lorsque vous démarrez une application JPA ou Hibernate, vous avez deux possibilités :
- Vous pouvez amorcer via le mécanisme natif d'Hibernate, et créer un fichier
SessionFactory
via le BootstrapServiceRegistryBuilder
. Si vous utilisez Spring, l'amorçage d'Hibernate se fait par le biais de la balise LocalSessionFactoryBean
comme illustré par cet exemple GitHub .
- Ou, vous pouvez créer une JPA
EntityManagerFactory
via le Persistence
ou la classe EntityManagerFactoryBuilder
. Si vous utilisez Spring, l'amorçage de JPA se fait via la fonction LocalContainerEntityManagerFactoryBean
comme illustré par cet exemple GitHub .
L'amorçage via JPA est à privilégier. C'est parce que l'interface JPA FlushModeType.AUTO
est un bien meilleur choix que l'ancien FlushMode.AUTO
qui casse la cohérence lecture-écriture pour les requêtes SQL natives .
Déballage de JPA vers Hibernate
De plus, si vous démarrez via JPA, et que vous avez injecté la fonction EntityManagerFactory
via le @PersistenceUnit
annotation :
@PersistenceUnit
private EntityManagerFactory entityManagerFactory;
Vous pouvez facilement avoir accès aux sous-jacents Sessionfactory
en utilisant le unwrap
méthode :
SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
On peut procéder de la même manière avec la JPA EntityManager
. Si vous injectez le EntityManager
via le @PersistenceContext
annotation :
@PersistenceContext
private EntityManager entityManager;
Vous pouvez facilement avoir accès aux sous-jacents Session
en utilisant le unwrap
méthode :
Session session = entityManager.unwrap(Session.class);
Conclusion
Ainsi, vous devez amorcer via JPA, utiliser la fonction EntityManagerFactory
y EntityManager
et ne les déballer vers leurs interfaces Hibernate associées que lorsque vous souhaitez accéder à certaines méthodes spécifiques à Hibernate qui ne sont pas disponibles dans JPA, comme l'extraction de l'entité via sa fonction Identifiant naturel .
6 votes
Cette réponse sur une question dupliquée est vraiment bonne. stackoverflow.com/questions/23445830/