web-dev-qa-db-fra.com

Hibernate SessionFactory contre EntityManagerFactory

Je suis nouveau sur Hibernate 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?

218
elpisu

Préférez EntityManagerFactory et EntityManager. Ils sont définis par la norme JPA.

SessionFactory et Session sont spécifiques à l'hibernation. La EntityManager appelle la session d'hibernation sous le capot. Et si vous avez besoin de fonctionnalités spécifiques qui ne sont pas disponibles dans EntityManager, vous pouvez obtenir la session en appelant:

Session session = entityManager.unwrap(Session.class);
331
Bozho

Je veux ajouter que vous pouvez également obtenir la session d'Hibernate en appelant la méthode getDelegate() à partir de EntityManager.

ex:

Session session = (Session) entityManager.getDelegate();
29
toytoy

L'utilisation de l'entité EntityManagerFactory nous permet d'utiliser des annotations de méthode de rappel telles que @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 connexes d'Hibernate peuvent être trouvés ici et ici .

Question SOF connexe et Discussion du forum de printemps

20
Kumar Sambhav

Je préfère l'API JPA2 EntityManager à SessionFactory, car elle semble 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 le premier a l'air plus propre et qu'il est également plus facile à tester car EntityManager peut être facilement simulé.

15
Bastian Voigt

En utilisant EntityManager, le code n'est plus étroitement associé à la veille prolongée. Mais pour cela, dans l'utilisation, 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 faiblement couplé. Si la mise en œuvre de JPA 2 est meilleure que celle d'hibernation, la commutation sera facile. Dans les cas extrêmes, nous pourrions taper le cast dans HibernateEntityManager. 

2
Sairam Krish

EntityManagerFactory est l'implémentation standard, c'est la même chose pour toutes les implémentations. Si vous migrez votre ORM pour un autre fournisseur tel qu'EclipseLink, la méthode de traitement de la transaction ne sera pas modifiée. En revanche, si vous utilisez la fabrique de sessions d’Hibernate, elle est liée aux API d’Hibernate et ne peut pas migrer vers un nouveau fournisseur.

1
Segun Emmanuel

L'interface EntityManager est similaire à sessionFactory dans hibernate . 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 à l'APP et session/sessionFactory est spécifique à l'hibernation.

0
Avvappa Hegadyal