Hibernate SessionFactory против EntityManagerFactory - PullRequest
227 голосов
/ 12 апреля 2011

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

Ответы [ 7 ]

340 голосов
/ 12 апреля 2011

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

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

Session session = entityManager.unwrap(Session.class);
30 голосов
/ 19 января 2013

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

например:

Session session = (Session) entityManager.getDelegate();
20 голосов
/ 09 сентября 2013

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

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

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

Вопросы, связанные с SOF и Обсуждение на весеннем форуме

17 голосов
/ 04 марта 2015

Я предпочитаю 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может быть легко издеваться.

2 голосов
/ 26 сентября 2014

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

javax.persistence.EntityManager

вместо

org.hibernate.ejb.HibernateEntityManager

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

1 голос
/ 07 июля 2019

EntityManagerFactory - стандартная реализация, она одинакова для всех реализаций. Если вы перенесете ORM на любого другого провайдера, такого как EclipseLink, подход к обработке транзакции не изменится. Напротив, если вы используете фабрику сессий hibernate, она привязана к API hibernate и не может перейти на нового поставщика.

1 голос
/ 24 июля 2018

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

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

...