it-roy-ru.com

Hibernate SessionFactory против EntityManagerFactory

Я новичок в Hibernate и неясно, использовать ли SessionFactory или EntityManagerFactory для получения сессии hibernate. Какая разница между двумя? За и против?

218
elpisu

Предпочитаю EntityManagerFactory и EntityManager. Они определены стандартом JPA.

SessionFactory и Session являются специфичными для hibernate. EntityManager вызывает сеанс гибернации под капотом. И если вам нужны некоторые специфические функции, которые не доступны в EntityManager, вы можете получить сеанс, вызвав:

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

Я хочу добавить к этому, что вы также можете получить сессию Hibernate, вызвав метод getDelegate() из EntityManager.

например:

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

Использование подхода EntityManagerFactory позволяет нам использовать аннотации методов обратного вызова, такие как @PrePersist, @ PostPersist, @ PreUpdate без дополнительной настройки. 

Использование подобных обратных вызовов при использовании SessionFactory потребует дополнительных усилий.

Связанные документы Hibernate можно найти здесь и здесь .

Связанный Вопрос SOF и Обсуждение Весеннего Форума

20
Kumar Sambhav

Я предпочитаю JPA2 EntityManager API, а не SessionFactory, потому что он кажется более современным. Один простой пример:

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

Я думаю, что ясно, что первый выглядит чище, а также его легче тестировать, потому что EntityManager легко подделывается.

15
Bastian Voigt

Используя EntityManager, код больше не тесно связан с Hibernate. Но для этого при использовании мы должны использовать:

javax.persistence.EntityManager

вместо 

org.hibernate.ejb.HibernateEntityManager

Аналогично, для EntityManagerFactory используйте интерфейс javax. Таким образом, код слабо связан. Если реализация JPA 2 лучше, чем в спящем режиме, переключение будет простым. В крайнем случае, мы можем набрать приведение к HibernateEntityManager. 

2
Sairam Krish

Интерфейс EntityManager похож на sessionFactory в hibernate . EntityManager в пакете javax.persistance, но session и sessionFactory в пакете org.hibernate.Session/sessionFactory.

Менеджер сущностей зависит от JPA, а session/sessionFactory - от спящего.

0
Avvappa Hegadyal