已添加spring-data-jpa依赖但EntityManager为空,创建SessionFactory失败
问题原因
- Bean初始化顺序问题:@Configuration类中字段注入的
EntityManager初始化时机晚于@Bean方法的执行时机,调用getSessionFactory()方法时,字段还未完成注入,因此为null。 - 原有代码逻辑错误:判断
entityManager.unwrap(Session.class) == null时才返回SessionFactory,条件写反,就算EntityManager不为空也会返回null。
解决方案
方案1:通过方法参数注入EntityManager
将EntityManager作为@Bean方法的入参传入,Spring会自动保证依赖的Bean先完成初始化再执行@Bean方法,修正逻辑后代码如下:
@Configuration public class BeanConfig { @Bean public SessionFactory getSessionFactory(EntityManager entityManager) { Session session = entityManager.unwrap(Session.class); if (session != null) { return session.getSessionFactory(); } throw new RuntimeException("无法从EntityManager获取Hibernate Session实例"); } }
方案2(更推荐):直接从EntityManagerFactory获取SessionFactory
EntityManager本身是线程不安全的实例,直接通过EntityManagerFactory转换更稳妥,代码更简洁:
@Configuration public class BeanConfig { @Bean public SessionFactory getSessionFactory(EntityManagerFactory entityManagerFactory) { return entityManagerFactory.unwrap(SessionFactory.class); } }
注意事项
- 确保项目启动类上添加了
@EntityScan注解,能正确扫描到所有JPA实体类 - 确认
application.properties中的数据库连接配置正确,启动时无数据库连接异常 - 现有
spring-boot-starter-data-jpa依赖已包含Hibernate核心组件,无需额外引入其他Hibernate相关依赖
内容的提问来源于stack exchange,提问作者Ajeeth
相关产品推荐
相关产品推荐

