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?

208
demandé sur Bozho 2011-04-12 23:51:24

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);
313
répondu Bozho 2011-04-12 19:52:32

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();
28
répondu toytoy 2013-08-12 14:01:44

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.

Docs D'hibernation liés peuvent être trouvés ici et ici .

question connexe et Discussion du forum de printemps

19
répondu Kumar Sambhav 2017-05-23 11:54:58

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é.

13
répondu Bastian Voigt 2017-01-02 20:29:03

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.

2
répondu Sairam Krish 2014-09-26 11:56:02

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.

0
répondu Avvappa Hegadyal 2018-07-24 10:16:42