Hibernate SessionFactory или EntityManagerFactory

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

Ответ 1

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

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

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

Ответ 2

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

Пример:

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

javax.persistence.EntityManager

вместо

org.hibernate.ejb.HibernateEntityManager

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

Ответ 6

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

Entity Manager специфичен для JPA, а session/sessionFactory - для режима гибернации.

Ответ 7

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