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 потребует дополнительных усилий.
Я предпочитаю 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.