Soy nuevo en Hibernate y no estoy seguro de si usar un Hibernate SessionFactory
o un JPA EntityManagerFactory
para crear un HibernateSession
.
¿Cuál es la diferencia entre estos dos? ¿Cuáles son los pros y los contras de usar cada uno de ellos?
Respuestas:
Prefiero
EntityManagerFactory
yEntityManager
. Están definidos por el estándar JPA.SessionFactory
ySession
son específicos de hibernación. ElEntityManager
invoca la sesión de hibernación bajo el capó. Y si necesita algunas características específicas que no están disponibles en elEntityManager
, puede obtener la sesión llamando a:fuente
Session
desdeEntityManager
, al igual queSessionFactory.getCurrentSession()
? Quiero decir, ¿se abrirá nuevoSession
si aún no se ha creado? ¿Cómo funciona en un entorno multiproceso?Quiero agregar a esto que también puede obtener la sesión de Hibernate llamando al
getDelegate()
método desdeEntityManager
.ex:
fuente
unwrap()
es que se prefiere más degetDelegate()
acuerdo con los documentos de Java: JavaEE 6 , y JavaEE 7 .Prefiero la
EntityManager
API JPA2 sobreSessionFactory
, porque se siente más moderna. Un ejemplo simple:JPA:
SessionFactory:
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.
fuente
return sessionFactory.getCurrentSession().createQuery("from User where id=1").list()
El uso del enfoque EntityManagerFactory nos permite usar anotaciones de métodos de devolución de llamada como @PrePersist, @ PostPersist, @ PreUpdate sin configuración adicional.
Usar devoluciones de llamada similares al usar SessionFactory requerirá esfuerzos adicionales.
Los documentos relacionados de Hibernate se pueden encontrar aquí y aquí .
Preguntas relacionadas con SOF y discusión en el foro de primavera
fuente
SessionFactory
vs.EntityManagerFactory
Como expliqué en la Guía del usuario de Hibernate , Hibernate
SessionFactory
extiende la JPAEntityManagerFactory
, como se ilustra en el siguiente diagrama:Entonces,
SessionFactory
también es un JPAEntityManagerFactory
.Tanto el
SessionFactory
y elEntityManagerFactory
contienen los metadatos de mapeo de la entidad y le permiten crear un HibernateSession
o unEntityManager
.Session
vs.EntityManager
Al igual que el
SessionFactory
yEntityManagerFactory
, el HibernateSession
extiende el JPAEntityManager
. Por lo tanto, todos los métodos definidos por elEntityManager
están disponibles en HibernateSession
.El
Session
y el `EntityManager traducen las transiciones de estado de la entidad en instrucciones SQL, como SELECT, INSERT, UPDATE y DELETE.Hibernate vs JPA bootstrap
Al iniciar una aplicación JPA o Hibernate, tiene dos opciones:
SessionFactory
víaBootstrapServiceRegistryBuilder
. Si está utilizando Spring, la rutina de arranque de Hibernate se realiza a través deLocalSessionFactoryBean
, como se ilustra en este ejemplo de GitHub .EntityManagerFactory
través de laPersistence
clase o elEntityManagerFactoryBuilder
. Si está utilizando Spring, el bootstrap JPA se realiza a través deLocalContainerEntityManagerFactoryBean
, como se ilustra en este ejemplo de GitHub .Se prefiere el bootstrapping a través de JPA. Esto se debe a que JPA
FlushModeType.AUTO
es una opción mucho mejor que el legadoFlushMode.AUTO
, que rompe la coherencia de lectura y escritura para consultas SQL nativas .Desenvolviendo JPA para Hibernar
Además, si arranca a través de JPA y ha inyectado a
EntityManagerFactory
través de la@PersistenceUnit
anotación:Puede acceder fácilmente al subyacente
Sessionfactory
utilizando elunwrap
método:Lo mismo se puede hacer con el JPA
EntityManager
. Si inyecta el aEntityManager
través de la@PersistenceContext
anotación:Puede acceder fácilmente al subyacente
Session
utilizando elunwrap
método:Conclusión
Por lo tanto, debe iniciar a través de JPA, usar el
EntityManagerFactory
yEntityManager
, y solo desenvolverlos en sus interfaces de Hibernate asociadas cuando desee obtener acceso a algunos métodos específicos de Hibernate que no están disponibles en JPA, como obtener la entidad a través de su identificador natural .fuente
Al usar EntityManager, el código ya no está estrechamente vinculado con la hibernación. Pero para esto, en el uso debemos usar:
en vez de
Del mismo modo, para EntityManagerFactory, use la interfaz javax. De esa manera, el código está débilmente acoplado. Si hay una mejor implementación de JPA 2 que hibernar, el cambio sería fácil. En casos extremos, podríamos escribir cast en HibernateEntityManager.
fuente
EntityManagerFactory es la implementación estándar, es la misma en todas las implementaciones. Si migra su ORM para cualquier otro proveedor como EclipseLink, no habrá ningún cambio en el enfoque para manejar la transacción. Por el contrario, si usa la fábrica de sesiones de hibernate, está vinculada a las API de hibernate y no puede migrar a un nuevo proveedor.
fuente
La interfaz 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 gestor de entidades es específico de JPA y session / sessionFactory es específico de hibernación.
fuente