java - example - hibernate sessionfactory or entitymanager
Hibernate SessionFactory vs. EntityManagerFactory (6)
Soy nuevo en Hibernate y no tengo claro si usar una SessionFactory
o EntityManagerFactory
para obtener la sesión de hibernate. ¿Cuál es la diferencia entre los dos? ¿Pros contras?
Al utilizar EntityManager, el código ya no está estrechamente relacionado con la hibernación. Pero para esto, en uso deberíamos usar:
javax.persistence.EntityManager
en lugar de
org.hibernate.ejb.HibernateEntityManager
De manera similar, para EntityManagerFactory, use la interfaz javax. De esa manera, el código está acoplado libremente. Si hay una mejor implementación de JPA 2 que hibernación, el cambio sería fácil. En casos extremos, podríamos escribir cast en HibernateEntityManager.
El uso del enfoque EntityManagerFactory nos permite usar las anotaciones del método de devolución de llamada como @PrePersist, @ PostPersist, @ PreUpdate sin configuración adicional.
El uso de devoluciones de llamada similares al usar SessionFactory requerirá esfuerzos adicionales.
Los documentos relacionados con Hibernate se pueden encontrar here y here .
Preguntas relacionadas con SOF y discusión en el foro de primavera
La interfaz de EntityManager es similar a sessionFactory en hibernación. EntityManager bajo el paquete javax.persistance pero session y sessionFactory bajo el paquete org.hibernate.Session / sessionFactory.
El administrador de entidades es específico de JPA y session / sessionFactory es específico de hibernación.
Prefiero EntityManagerFactory
y EntityManager
. Están definidos por el estándar JPA.
SessionFactory
y Session
son específicos de hibernación. El EntityManager
invoca la sesión de hibernación bajo el capó. Y si necesita algunas funciones específicas que no están disponibles en el EntityManager
, puede obtener la sesión llamando a:
Session session = entityManager.unwrap(Session.class);
Prefiero la API JPA2 EntityManager
sobre SessionFactory
, porque se siente más moderna. Un ejemplo 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;
}
Creo que está claro que el primero se ve más limpio y también es más fácil de probar porque EntityManager se puede burlar fácilmente.
Quiero agregar a esto que también puede obtener la sesión de Hibernate llamando getDelegate()
método getDelegate()
de EntityManager
.
ex:
Session session = (Session) entityManager.getDelegate();