SessionFactory vs. EntityManagerFactory
Como expliqué en la Guía del usuario de Hibernate , Hibernate SessionFactoryextiende la JPA EntityManagerFactory, como se ilustra en el siguiente diagrama:

Entonces, SessionFactorytambién es un JPA EntityManagerFactory.
Tanto el SessionFactoryy el EntityManagerFactorycontienen los metadatos de mapeo de la entidad y le permiten crear un Hibernate Sessiono un EntityManager.
Session vs. EntityManager
Al igual que el SessionFactoryy EntityManagerFactory, el Hibernate Sessionextiende el JPA EntityManager. Por lo tanto, todos los métodos definidos por el EntityManagerestá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:
- Puede iniciar mediante el mecanismo nativo de Hibernate y crear una
SessionFactoryví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
EntityManagerFactorytravés de la Persistenceclase 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.AUTOes 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 EntityManagerFactorytravés de la @PersistenceUnitanotación:
@PersistenceUnit
private EntityManagerFactory entityManagerFactory;
Puede acceder fácilmente al subyacente Sessionfactoryutilizando el unwrapmétodo:
SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
Lo mismo se puede hacer con el JPA EntityManager. Si inyecta el a EntityManagertravés de la @PersistenceContextanotación:
@PersistenceContext
private EntityManager entityManager;
Puede acceder fácilmente al subyacente Sessionutilizando el unwrapmétodo:
Session session = entityManager.unwrap(Session.class);
Conclusión
Por lo tanto, debe iniciar a través de JPA, usar el EntityManagerFactoryy 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 .