web-dev-qa-db-ja.com

Spring Boot-Hibernate SessionFactoryのハンドル

Spring Bootによって作成されたHibernate SessionFactoryのハンドルを取得する方法を知っている人はいますか?

50
Peter

これは次の方法で実現できます。

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

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

}
53
Andreas

Hibernate SessionFactoryを自動配線する最も簡単で冗長な方法は次のとおりです。

これは、Hibernate 4を使用したSpring Bootのソリューションです

application.properties:

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

構成クラス:

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

その後、通常どおりサービスのSessionFactoryを自動配線できます。

@Autowired
private SessionFactory sessionFactory;

Hibernate 5でのSpring Boot 1.5の時点で、これが推奨される方法です:

application.properties:

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

構成クラス:

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

素晴らしい仕事アンドレアス。 SessionFactoryを自動配線できるように、Beanバージョンを作成しました。

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

Yglodtのに似た別の方法

Application.propertiesで:

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

そして、構成クラスで:

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

その後、通常どおりサービスのSessionFactoryを自動配線できます。

@Autowired
private SessionFactory sessionFactory;
6
Lorenzo Lerate

Spring Boot 2.1.0およびHibernate 5で動作します

@PersistenceContext
private EntityManager entityManager;

次に、entityManager.unwrap(Session.class)を使用して新しいセッションを作成できます。

Session session = null;
if (entityManager == null
    || (session = entityManager.unwrap(Session.class)) == null) {

    throw new NullPointerException();
}

クエリの作成例:

session.createQuery("FROM Student");

application.properties:

spring.datasource.driver-class-name=Oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:Oracle:thin:@localhost:1521:db11g
spring.datasource.username=admin
spring.datasource.password=admin
spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
4

@Autowireを介してSessionFactoryにアクセスすることが本当に必要な場合は、次のように別のEntityManagerFactoryを構成し、それを使用してSessionFactory Beanを構成します。

@Configuration
public class SessionFactoryConfig {

@Autowired 
DataSource dataSource;

@Autowired
JpaVendorAdapter jpaVendorAdapter;

@Bean
@Primary
public EntityManagerFactory entityManagerFactory() {
    LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
    emf.setDataSource(dataSource);
    emf.setJpaVendorAdapter(jpaVendorAdapter);
    emf.setPackagesToScan("com.hibernateLearning");
    emf.setPersistenceUnitName("default");
    emf.afterPropertiesSet();
    return emf.getObject();
}

@Bean
public SessionFactory setSessionFactory(EntityManagerFactory entityManagerFactory) {
    return entityManagerFactory.unwrap(SessionFactory.class);
} }
1
Sen