Hibernate SessionFactory vs. EntityManagerFactory
je suis nouveau en hibernation et je ne sais pas s'il faut utiliser un SessionFactory
ou EntityManagerFactory
pour obtenir la session d'hibernation. Quelle est la différence entre les deux? Avantages Et Inconvénients?
6 réponses
Préfèrent EntityManagerFactory
et EntityManager
. Elles sont définies par la norme JPA.
SessionFactory
et Session
sont hibernate. Le EntityManager
évoque la session d'hibernation sous le capot. Et si vous avez besoin de certaines fonctionnalités spécifiques qui ne sont pas disponibles dans le EntityManager
, vous pouvez obtenir la session en appelant:
Session session = entityManager.unwrap(Session.class);
je tiens à ajouter sur ce que vous pouvez également obtenir la session D'hibernation en appelant getDelegate()
méthode de EntityManager
.
ex:
Session session = (Session) entityManager.getDelegate();
L'utilisation de EntityManagerFactory approach nous permet d'utiliser des annotations de méthode de callback comme @PrePersist, @PostPersist,@PreUpdate sans configuration supplémentaire.
utiliser des callbacks similaires tout en utilisant SessionFactory nécessitera des efforts supplémentaires.
je préfère le JPA2 EntityManager
API sur SessionFactory
, parce qu'il se sent plus moderne. Un exemple simple:
JPA:
@PersistenceContext
EntityManager entityManager;
public List<MyEntity> findSomeApples() {
return entityManager
.createQuery("from MyEntity where apples=7", MyEntity.class)
.getResultList();
}
SessionFactory:
@Autowired
SessionFactory sessionFactory;
public List<MyEntity> findSomeApples() {
Session session = sessionFactory.getCurrentSession();
List<?> result = session.createQuery("from MyEntity where apples=7")
.list();
@SuppressWarnings("unchecked")
List<MyEntity> resultCasted = (List<MyEntity>) result;
return resultCasted;
}
je pense qu'il est clair que la première semble plus propre et est également plus facile à tester parce Entity Manager peut être facilement moqué.
en utilisant EntityManager, le code n'est plus couplé étroitement avec hibernation. Mais pour cela, dans l'usage nous devrions utiliser:
javax.persistence.EntityManager
au lieu de
org.hibernate.ejb.HibernateEntityManager
de même, pour EntityManagerFactory, utilisez l'interface javax. De cette façon, le code est vaguement couplé. S'il y a une meilleure implémentation de JPA 2 que celle d'hibernation, la commutation serait facile. Dans le cas extrême, nous pourrions taper moulage à Hibernententitymanager.
EntityManager interface est similaire à sessionFactory en hibernation. EntityManager sous javax.persistance paquet, mais de session et d'une sessionFactory sous org.hiberner.Paquet Session/sessionFactory.
Entity manager est spécifique à JPA et session / sessionFactory est spécifique à hibernate.