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.