java - application - Spring Boot-Manejar para Hibernar SessionFactory
spring jpa (4)
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);
}
¿Alguien sabe cómo manejar Hibernate SessionFactory creado por Spring Boot?
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;
}
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;
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);
}
}