data application java spring hibernate spring-boot

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); } }