manager example create java hibernate jpa sessionfactory hibernate-entitymanager

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();