Hibernate SessionFactory vs EntityManagerFactory
Je suis nouvelle mise en veille prolongée et je suis pas clair de savoir si l'utilisation d'un SessionFactory
ou EntityManagerFactory
pour obtenir la session hibernate. Quelle est la différence entre les deux? Pour & Cons?
- Cette réponse sur un double question est vraiment bon. stackoverflow.com/questions/23445830/...
Vous devez vous connecter pour publier un commentaire.
Préfèrent
EntityManagerFactory
etEntityManager
. Ils sont définis par la JPA standard.SessionFactory
etSession
sont hibernate spécifiques. LeEntityManager
appelle la session hibernate sous le capot. Et si vous avez besoin de certaines fonctionnalités spécifiques qui ne sont pas disponibles dans leEntityManager
, vous pouvez obtenir la session en appelant:spring-data-jpa
qui l'utilise.Quels sont les inconvénients sur la sessionFactory.MerciSession
deEntityManager
, de même queSessionFactory.getCurrentSession()
? Je veux dire, il va ouvrir de nouvellesSession
si elle n'est pas déjà créé? Comment ça fonctionne en environnement multithread?Je tiens à ajouter sur ce que vous pouvez également obtenir de Hibernate session en appelant
getDelegate()
méthode deEntityManager
.ex:
unwrap()
est pour être préféré au cours degetDelegate()
selon la java docs: javaee 6 et javaee 7.À l'aide de EntityManagerFactory approche nous permet d'utiliser la méthode de rappel annotations: @PrePersist, @PostPersist,@PreUpdate sans configuration supplémentaire.
En utilisant les mêmes rappels lors de l'utilisation d'une SessionFactory nécessitera des efforts supplémentaires.
Liées Hibernate docs peuvent être trouvés ici et ici.
Liées SOF Question et Printemps Forum de discussion
Je préfère le JPA2
EntityManager
API surSessionFactory
, parce qu'il se sent plus moderne. Un exemple simple:JPA:
SessionFactory:
Je pense qu'il est clair que le premier semble plus propre et aussi plus facile à tester car EntityManager peut facilement être moqué.
return sessionFactory.getCurrentSession().createQuery("from User where id=1").list()
En utilisant l'EntityManager, le code n'est plus aussi étroitement couplé avec hibernate. Mais pour cela, dans l'usage que nous devrions utiliser :
au lieu de
De même, pour EntityManagerFactory, utilisez l'interface javax. De cette façon, le code est faiblement couplé. Si il y a une meilleure JPA 2 mise en œuvre de hibernate, commutation serait facile. Dans un cas extrême, nous pourrions type de fonte à HibernateEntityManager.
EntityManager interface est similaire à sessionFactory dans hibernate.
EntityManager sous javax.persistance paquet, mais de session et d'une sessionFactory sous org.mise en veille prolongée.Session/sessionFactory paquet.
Gestionnaire d'entités JPA est spécifique et session/sessionFactory sont hibernate spécifiques.