Hibernate SessionFactory vs. EntityManagerFactory
Jestem nowy w hibernacji i nie wiem, czy użyć SessionFactory
Czy EntityManagerFactory
do uzyskania sesji hibernacji. Jaka jest różnica między nimi? Plusy I Minusy?
6 answers
Preferują EntityManagerFactory
i EntityManager
. Są one zdefiniowane przez standard JPA.
SessionFactory
i {[4] } są specyficzne dla hibernacji. EntityManager
wywołuje sesję hibernate pod maską. A jeśli potrzebujesz określonych funkcji, które nie są dostępne w EntityManager
, możesz uzyskać sesję, dzwoniąc:
Session session = entityManager.unwrap(Session.class);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-12 19:52:32
Chcę dodać, że można również uzyskać sesję Hibernate przez wywołanie metody getDelegate()
z EntityManager
.
Ex:
Session session = (Session) entityManager.getDelegate();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-12 14:01:44
Używanie podejścia EntityManagerFactory pozwala nam używać adnotacji metody callback, takich jak @PrePersist,@PostPersist, @ PreUpdate bez dodatkowej konfiguracji.
Używanie podobnych wywołań zwrotnych podczas korzystania z SessionFactory będzie wymagało dodatkowych wysiłków.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:58
Wolę API JPA2 EntityManager
niż SessionFactory
, ponieważ wydaje się bardziej nowoczesne. Jeden prosty przykład:
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;
}
Myślę, że to jasne, że pierwszy z nich wygląda czyściej i jest łatwiejszy do przetestowania, ponieważ EntityManager można łatwo wyśmiać.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-02 20:29:03
Używając EntityManager, kod nie jest już ściśle powiązany z hibernate. Ale do tego, w użyciu powinniśmy użyć :
javax.persistence.EntityManager
Zamiast
org.hibernate.ejb.HibernateEntityManager
Podobnie, dla EntityManagerFactory, Użyj interfejsu javax. W ten sposób kod jest luźno powiązany. Jeśli istnieje lepsza implementacja JPA 2 niż hibernate, przełączanie byłoby łatwe. W skrajnym przypadku możemy wpisać cast do HibernateEntityManager.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-26 11:56:02
Interfejs EntityManager jest podobny do sessionFactory w hibernate. EntityManager pod javax.pakiet persistance, ale session I sessionFactory pod org.hibernacja.Pakiet Session / sessionFactory.
Entity manager jest specyficzny dla JPA, a session / sessionFactory są specyficzne dla hibernate.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-24 10:16:42