Hibernate SessionFactory vs. EntityManagerFactory

Jestem nowy w hibernacji i nie wiem, czy użyć SessionFactory Czy EntityManagerFactory do uzyskania sesji hibernacji. Jaka jest różnica między nimi? Plusy I Minusy?

Author: Bozho, 2011-04-12

6 answers

Preferują EntityManagerFactory i EntityManager. Są one zdefiniowane przez standard JPA.

SessionFactory i {[4] } są specyficzne dla hibernacji. EntityManager wywołuje sesję hibernate pod maską. A jeśli potrzebujesz określonych funkcji, które nie są dostępne w EntityManager, możesz uzyskać sesję, dzwoniąc:

Session session = entityManager.unwrap(Session.class);
 313
Author: Bozho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-12 19:52:32

Chcę dodać, że można również uzyskać sesję Hibernate przez wywołanie metody getDelegate() z EntityManager.

Ex:

Session session = (Session) entityManager.getDelegate();
 28
Author: toytoy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-12 14:01:44

Używanie podejścia EntityManagerFactory pozwala nam używać adnotacji metody callback, takich jak @PrePersist,@PostPersist, @ PreUpdate bez dodatkowej konfiguracji.

Używanie podobnych wywołań zwrotnych podczas korzystania z SessionFactory będzie wymagało dodatkowych wysiłków.

Powiązane dokumenty Hibernate można znaleźć tutaj i tutaj.

Powiązane pytania SOF i wiosenne forum dyskusyjne

 19
Author: Kumar Sambhav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:58

Wolę API JPA2 EntityManager niż SessionFactory, ponieważ wydaje się bardziej nowoczesne. Jeden prosty przykład:

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;
}

Myślę, że to jasne, że pierwszy z nich wygląda czyściej i jest łatwiejszy do przetestowania, ponieważ EntityManager można łatwo wyśmiać.

 13
Author: Bastian Voigt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-02 20:29:03

Używając EntityManager, kod nie jest już ściśle powiązany z hibernate. Ale do tego, w użyciu powinniśmy użyć :

javax.persistence.EntityManager

Zamiast

org.hibernate.ejb.HibernateEntityManager

Podobnie, dla EntityManagerFactory, Użyj interfejsu javax. W ten sposób kod jest luźno powiązany. Jeśli istnieje lepsza implementacja JPA 2 niż hibernate, przełączanie byłoby łatwe. W skrajnym przypadku możemy wpisać cast do HibernateEntityManager.

 2
Author: Sairam Krish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-26 11:56:02

Interfejs EntityManager jest podobny do sessionFactory w hibernate. EntityManager pod javax.pakiet persistance, ale session I sessionFactory pod org.hibernacja.Pakiet Session / sessionFactory.

Entity manager jest specyficzny dla JPA, a session / sessionFactory są specyficzne dla hibernate.

 0
Author: Avvappa Hegadyal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-24 10:16:42