Я новичок в 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 потребует дополнительных усилий.
Ответ 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 и не может перейти на нового поставщика.