SessionFactory
vs. EntityManagerFactory
Como expliqué en la Guía del usuario de Hibernate , Hibernate SessionFactory
extiende la JPA EntityManagerFactory
, como se ilustra en el siguiente diagrama:
Entonces, SessionFactory
también es un JPA EntityManagerFactory
.
Tanto el SessionFactory
y el EntityManagerFactory
contienen los metadatos de mapeo de la entidad y le permiten crear un Hibernate Session
o un EntityManager
.
Session
vs. EntityManager
Al igual que el SessionFactory
y EntityManagerFactory
, el Hibernate Session
extiende el JPA EntityManager
. Por lo tanto, todos los métodos definidos por el EntityManager
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:
- Puede iniciar mediante el mecanismo nativo de Hibernate y crear una
SessionFactory
vía BootstrapServiceRegistryBuilder
. Si está utilizando Spring, la rutina de arranque de Hibernate se realiza a través de LocalSessionFactoryBean
, como se ilustra en este ejemplo de GitHub .
- O bien, puede crear un JPA a
EntityManagerFactory
través de la Persistence
clase o el EntityManagerFactoryBuilder
. Si está utilizando Spring, el bootstrap JPA se realiza a través de LocalContainerEntityManagerFactoryBean
, 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 legado FlushMode.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:
@PersistenceUnit
private EntityManagerFactory entityManagerFactory;
Puede acceder fácilmente al subyacente Sessionfactory
utilizando el unwrap
método:
SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
Lo mismo se puede hacer con el JPA EntityManager
. Si inyecta el a EntityManager
través de la @PersistenceContext
anotación:
@PersistenceContext
private EntityManager entityManager;
Puede acceder fácilmente al subyacente Session
utilizando el unwrap
método:
Session session = entityManager.unwrap(Session.class);
Conclusión
Por lo tanto, debe iniciar a través de JPA, usar el EntityManagerFactory
y EntityManager
, 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 .