如何在 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 的轻松访问。 EntityManager
和 EntityManagerFactory
提供了一个 unwrap
方法,该方法返回 JPA 实现的相应类。
对于 Hibernate,它们是 Session
和 SessionFactory
。
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 服务中