如何在 Spring Boot 中自动装配 Hibernate SessionFactory

Posted

技术标签:

【中文标题】如何在 Spring Boot 中自动装配 Hibernate SessionFactory【英文标题】:How to autowire Hibernate SessionFactory in Spring boot 【发布时间】:2017-10-09 06:56:27 【问题描述】:

我已经创建了一个 Spring Boot 应用程序,我想处理 Hibernate SessionFactory,所以在我的服务类中,我可以调用 Hibernate SessionFactory 如下:

@Autowired
private SessionFactory sessionFactory;

我在 *** 中发现了一个类似的问题,我必须在 application.properties 中添加以下行:

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

但我收到此错误:

Cannot resolve property 'current_session_context_class' in java.lang.String

我该如何解决这个问题?

pom.xml 依赖:

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>

【问题讨论】:

【参考方案1】:

从 2.0 版开始,JPA 提供了对底层实现 API 的轻松访问。 EntityManagerEntityManagerFactory 提供了一个 unwrap 方法,该方法返回 JPA 实现的相应类。

对于 Hibernate,它们是 SessionSessionFactory

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

【讨论】:

您的解决方案将抛出:java.lang.NullPointerException: null。 entityManagerFactory.unwrap(SessionFactory.class) 必须在需要时调用。我也习惯了旧的事务管理器,我不得不改变经典的 sessionFactory.getCurrentTransaction();到 sessionFactory.openTransaction();我真的希望它不会忽略 Spring 托管事务。 此 API 已更改。你现在需要使用Session session = entityManager.unwrap(Session.class); SessionFactory sessionFactory = session.getSessionFactory()【参考方案2】:

尝试在您的 Spring 配置中启用 HibernateJpaSessionFactoryBean

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

看看: https://***.com/a/33881946/676731

通过 Spring 配置,我的意思是使用 @Configuration 注释或 @SpringBootApplication 注释的类(它隐式使用 @Configuration 注释)。

【讨论】:

按Spring配置你的意思是@SpringBootApplication注解的类,对吧? 这将引发 NoSuchBeanDefinitionException:没有可用的“javax.persistence.EntityManagerFactory”类型的合格 bean:预计至少有 1 个 bean。也被标记为已弃用 已弃用

以上是关于如何在 Spring Boot 中自动装配 Hibernate SessionFactory的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 自动装配定义与自定义starter原理,及如何实现自定义装配

Spring Boot 自动装配定义与自定义starter原理,及如何实现自定义装配

spring boot:如何配置自动装配的 WebTestClient

如何在 Spring Boot 中实现通用 JPA 存储库 - 它可以自动装配到任何实体/类类型的 Spring 服务中

如何使用Spring Boot从不同的包中自动装配存储库接口?

在 Spring Boot 中的控制器中自动装配通用(T)服务