Spring Boot – Manejar para Hibernar SessionFactory

¿Alguien sabe cómo manejar Hibernate SessionFactory creado por Spring Boot?

Puedes lograr esto con:

SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);

donde entityManagerFactory es una JPA EntityManagerFactory .

 package net.andreaskluth.hibernatesample; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class SomeService { private SessionFactory hibernateFactory; @Autowired public SomeService(EntityManagerFactory factory) { if(factory.unwrap(SessionFactory.class) == null){ throw new NullPointerException("factory is not a hibernate factory"); } this.hibernateFactory = factory.unwrap(SessionFactory.class); } } 

La manera más simple y menos detallada para autoconectar su Hibernate SessionFactory es:

Esta es la solución para Spring Boot con Hibernate 4:

application.properties:

 spring.jpa.properties.hibernate.current_session_context_class= org.springframework.orm.hibernate4.SpringSessionContext 

Clase de configuración:

 @Bean public HibernateJpaSessionFactoryBean sessionFactory() { return new HibernateJpaSessionFactoryBean(); } 

Luego puede conectar automáticamente SessionFactory en sus servicios como de costumbre:

 @Autowired private SessionFactory sessionFactory; 

A partir de Spring Boot 1.5 con Hibernate 5, esta es ahora la forma preferida:

application.properties:

 spring.jpa.properties.hibernate.current_session_context_class= org.springframework.orm.hibernate5.SpringSessionContext 

Clase de configuración:

 @EnableAutoConfiguration ... ... @Bean public HibernateJpaSessionFactoryBean sessionFactory(EntityManagerFactory emf) { HibernateJpaSessionFactoryBean fact = new HibernateJpaSessionFactoryBean(); fact.setEntityManagerFactory(emf); return fact; } 

Gran trabajo Andreas. Creé una versión de frijol para que SessionFactory pudiera autoconectarse.

 import javax.persistence.EntityManagerFactory; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; .... @Autowired private EntityManagerFactory entityManagerFactory; @Bean public SessionFactory getSessionFactory() { if (entityManagerFactory.unwrap(SessionFactory.class) == null) { throw new NullPointerException("factory is not a hibernate factory"); } return entityManagerFactory.unwrap(SessionFactory.class); } 

Otra forma similar a la de Yglodt

En application.properties:

 spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext 

Y en tu clase de configuración:

 @Bean public SessionFactory sessionFactory(HibernateEntityManagerFactory hemf) { return hemf.getSessionFactory(); } 

Luego puede conectar automáticamente SessionFactory en sus servicios como de costumbre:

 @Autowired private SessionFactory sessionFactory;