Je suis nouveau sur Hibernate et je ne sais pas s'il faut utiliser un SessionFactory
ou EntityManagerFactory
pour obtenir la session d'hibernation Quelle est la différence entre les deux? Avantages et inconvénients?
Préférez EntityManagerFactory
et EntityManager
. Ils sont définis par la norme JPA.
SessionFactory
et Session
sont spécifiques à l'hibernation. La EntityManager
appelle la session d'hibernation sous le capot. Et si vous avez besoin de fonctionnalités spécifiques qui ne sont pas disponibles dans EntityManager
, vous pouvez obtenir la session en appelant:
Session session = entityManager.unwrap(Session.class);
Je veux ajouter que vous pouvez également obtenir la session d'Hibernate en appelant la méthode getDelegate()
à partir de EntityManager
.
ex:
Session session = (Session) entityManager.getDelegate();
L'utilisation de l'entité EntityManagerFactory nous permet d'utiliser des annotations de méthode de rappel telles que @PrePersist, @ PostPersist, @ PreUpdate sans configuration supplémentaire.
L'utilisation de rappels similaires lors de l'utilisation de SessionFactory nécessitera des efforts supplémentaires.
Les documents connexes d'Hibernate peuvent être trouvés ici et ici .
Je préfère l'API JPA2 EntityManager
à SessionFactory
, car elle semble plus moderne. Un exemple simple:
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;
}
Je pense qu'il est clair que le premier a l'air plus propre et qu'il est également plus facile à tester car EntityManager peut être facilement simulé.
En utilisant EntityManager, le code n'est plus étroitement associé à la veille prolongée. Mais pour cela, dans l'utilisation, nous devrions utiliser:
javax.persistence.EntityManager
au lieu de
org.hibernate.ejb.HibernateEntityManager
De même, pour EntityManagerFactory, utilisez l'interface javax. De cette façon, le code est faiblement couplé. Si la mise en œuvre de JPA 2 est meilleure que celle d'hibernation, la commutation sera facile. Dans les cas extrêmes, nous pourrions taper le cast dans HibernateEntityManager.
EntityManagerFactory est l'implémentation standard, c'est la même chose pour toutes les implémentations. Si vous migrez votre ORM pour un autre fournisseur tel qu'EclipseLink, la méthode de traitement de la transaction ne sera pas modifiée. En revanche, si vous utilisez la fabrique de sessions d’Hibernate, elle est liée aux API d’Hibernate et ne peut pas migrer vers un nouveau fournisseur.
L'interface EntityManager est similaire à sessionFactory dans hibernate . EntityManager sous le package javax.persistance mais session et sessionFactory sous le package org.hibernate.Session/sessionFactory.
Le gestionnaire d'entités est spécifique à l'APP et session/sessionFactory est spécifique à l'hibernation.