Je suis nouveau sur Hibernate et je ne sais pas s'il faut utiliser un Hibernate SessionFactory
ou un JPA EntityManagerFactory
pour créer un Hibernate Session
.
Quelle est la différence entre ces deux? Quels sont les avantages et les inconvénients de l'utilisation de chacun d'entre eux?
Réponses:
Préférez
EntityManagerFactory
etEntityManager
. Ils sont définis par la norme JPA.SessionFactory
etSession
sont spécifiques à l'hibernation. LeEntityManager
invoque la session d'hibernation sous le capot. Et si vous avez besoin de fonctionnalités spécifiques qui ne sont pas disponibles dans leEntityManager
, vous pouvez obtenir la session en appelant:la source
Session
deEntityManager
, même queSessionFactory.getCurrentSession()
? Je veux dire, ouvrira-t-il de nouveauSession
s'il n'est pas déjà créé? Comment ça marche dans un environnement multithread?Je veux ajouter à cela que vous pouvez également obtenir la session d'Hibernate en appelant la
getDelegate()
méthode à partir deEntityManager
.ex:
la source
unwrap()
est à préférer au cours d'getDelegate()
après les documents java: javaee 6 , et javaee 7 .Je préfère l'
EntityManager
API JPA2SessionFactory
, car elle semble plus moderne. Un exemple simple:JPA:
SessionFactory:
Je pense qu'il est clair que le premier semble plus propre et qu'il est également plus facile à tester car EntityManager peut être facilement moqué.
la source
return sessionFactory.getCurrentSession().createQuery("from User where id=1").list()
L'utilisation de l'approche EntityManagerFactory nous permet d'utiliser des annotations de méthode de rappel comme @PrePersist, @ PostPersist, @ PreUpdate sans configuration supplémentaire.
L'utilisation de rappels similaires lors de l'utilisation de SessionFactory nécessitera des efforts supplémentaires.
Les documents Hibernate associés peuvent être trouvés ici et ici .
Questions SOF connexes et discussion du forum de printemps
la source
SessionFactory
contre.EntityManagerFactory
Comme je l'ai expliqué dans le Guide de l'utilisateur d'Hibernate , l'Hibernate
SessionFactory
étend le JPAEntityManagerFactory
, comme illustré par le diagramme suivant:Donc,
SessionFactory
c'est aussi un JPAEntityManagerFactory
.Le
SessionFactory
et leEntityManagerFactory
contiennent les métadonnées de mappage d'entité et vous permettent de créer un HibernateSession
ou unEntityManager
.Session
contre.EntityManager
Tout comme le
SessionFactory
etEntityManagerFactory
, l'HibernateSession
étend le JPAEntityManager
. Ainsi, toutes les méthodes définies par leEntityManager
sont disponibles dans HibernateSession
.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:
SessionFactory
via leBootstrapServiceRegistryBuilder
. Si vous utilisez Spring, le bootstrap Hibernate se fait via leLocalSessionFactoryBean
, comme illustré par cet exemple GitHub .EntityManagerFactory
via lePersistence
classe ou leEntityManagerFactoryBuilder
. Si vous utilisez Spring, le bootstrap JPA se fait via leLocalContainerEntityManagerFactoryBean
, 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éritageFlushMode.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:Vous pouvez facilement accéder au sous-jacent
Sessionfactory
utilisant launwrap
méthode:La même chose peut être faite avec l'APP
EntityManager
. Si vous injectez leEntityManager
via l'@PersistenceContext
annotation:Vous pouvez facilement accéder au sous-jacent
Session
utilisant launwrap
méthode:Conclusion
Par conséquent, vous devez démarrer via JPA, utiliser les symboles
EntityManagerFactory
etEntityManager
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 .la source
En utilisant EntityManager, le code n'est plus étroitement associé à la mise en veille prolongée. Mais pour cela, en utilisation, nous devons utiliser:
au lieu de
De même, pour EntityManagerFactory, utilisez l'interface javax. De cette façon, le code est faiblement couplé. S'il existe une meilleure implémentation de JPA 2 que l'hibernation, la commutation serait facile. Dans le cas extrême, nous pourrions taper cast à HibernateEntityManager.
la source
EntityManagerFactory est l'implémentation standard, elle est la même dans toutes les implémentations. Si vous migrez votre ORM pour un autre fournisseur comme EclipseLink, il n'y aura aucun changement dans l'approche de gestion de la transaction. En revanche, si vous utilisez la fabrique de sessions hibernate, elle est liée aux API hibernate et ne peut pas migrer vers un nouveau fournisseur.
la source
L'interface EntityManager est similaire à sessionFactory en veille prolongée. EntityManager sous le package javax.persistance mais session et sessionFactory sous le package org.hibernate.Session / sessionFactory.
Le gestionnaire d'entités est spécifique à JPA et la session / sessionFactory est spécifique à l'hibernation.
la source