Hibernate SessionFactory против EntityManagerFactory

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

6 ответов


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

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

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

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

ex:

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

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

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

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

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


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


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

javax.persistence.EntityManager

вместо

org.hibernate.ejb.HibernateEntityManager

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


интерфейс EntityManager похож на sessionFactory в спящем режиме. EntityManager под javax.пакет persistance, но сеанс и sessionFactory под org.зимовать.Пакет Session/sessionFactory.

Entity manager зависит от JPA, а session/sessionFactory-от hibernate.