Soy nuevo en Hibernate y no estoy seguro de si usar un Hibernate SessionFactoryo un JPA EntityManagerFactorypara 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
EntityManagerFactoryyEntityManager. Están definidos por el estándar JPA.SessionFactoryySessionson específicos de hibernación. ElEntityManagerinvoca 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
SessiondesdeEntityManager, al igual queSessionFactory.getCurrentSession()? Quiero decir, ¿se abrirá nuevoSessionsi 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
EntityManagerAPI 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
SessionFactoryvs.EntityManagerFactoryComo expliqué en la Guía del usuario de Hibernate , Hibernate
SessionFactoryextiende la JPAEntityManagerFactory, como se ilustra en el siguiente diagrama:Entonces,
SessionFactorytambién es un JPAEntityManagerFactory.Tanto el
SessionFactoryy elEntityManagerFactorycontienen los metadatos de mapeo de la entidad y le permiten crear un HibernateSessiono unEntityManager.Sessionvs.EntityManagerAl igual que el
SessionFactoryyEntityManagerFactory, el HibernateSessionextiende el JPAEntityManager. Por lo tanto, todos los métodos definidos por elEntityManagerestán disponibles en HibernateSession.El
Sessiony 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:
SessionFactoryví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 .EntityManagerFactorytravés de laPersistenceclase 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.AUTOes 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
EntityManagerFactorytravés de la@PersistenceUnitanotación:Puede acceder fácilmente al subyacente
Sessionfactoryutilizando elunwrapmétodo:Lo mismo se puede hacer con el JPA
EntityManager. Si inyecta el aEntityManagertravés de la@PersistenceContextanotación:Puede acceder fácilmente al subyacente
Sessionutilizando elunwrapmétodo:Conclusión
Por lo tanto, debe iniciar a través de JPA, usar el
EntityManagerFactoryyEntityManager, 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