配置Hibernate与JwtFilter认证时遇SessionFactory缺失错误求助
解决SessionFactory Bean找不到的问题
核心根因
你的FooBooUserRepository通过构造函数依赖org.hibernate.SessionFactory,但Spring容器中并未注册该类型的Bean实例。Spring Boot默认不会自动创建SessionFactory Bean,需要显式配置或通过JPA的EntityManagerFactory转换获取。
具体解决办法
1. 显式配置SessionFactory Bean
创建Hibernate配置类,手动注册SessionFactory:
import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.orm.hibernate5.LocalSessionFactoryBean; import javax.sql.DataSource; import java.util.Properties; @Configuration public class HibernateConfig { @Autowired private DataSource dataSource; @Bean public LocalSessionFactoryBean sessionFactory() { LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); sessionFactory.setDataSource(dataSource); // 替换为你的实体类所在包路径 sessionFactory.setPackagesToScan("com.foo.boo.entity"); Properties hibernateProps = new Properties(); hibernateProps.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect"); hibernateProps.setProperty("hibernate.show_sql", "true"); sessionFactory.setHibernateProperties(hibernateProps); return sessionFactory; } @Bean public SessionFactory hibernateSessionFactory(LocalSessionFactoryBean sessionFactoryBean) { return sessionFactoryBean.getObject(); } }
2. 检查Repository的注入逻辑
确保FooBooUserRepository的构造函数注入能被Spring识别:
public class FooBooUserRepository { private final SessionFactory sessionFactory; // 构造函数注入,Spring会自动匹配上面配置的SessionFactory Bean public FooBooUserRepository(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } // 业务方法实现... }
3. 确认依赖完整性
检查项目依赖是否包含Hibernate核心及Spring ORM组件:
Maven(pom.xml):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> </dependency>
Gradle(build.gradle):
implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.hibernate:hibernate-core'
4. 替代方案:从EntityManagerFactory获取SessionFactory
如果项目使用JPA的EntityManagerFactory,可直接转换获取SessionFactory,无需单独配置:
import org.hibernate.SessionFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import javax.sql.DataSource; import java.util.Properties; @Configuration public class JpaConfig { @Autowired private DataSource dataSource; @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory() { LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(dataSource); em.setPackagesToScan("com.foo.boo.entity"); HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); em.setJpaVendorAdapter(vendorAdapter); Properties props = new Properties(); props.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect"); em.setJpaProperties(props); return em; } @Bean public SessionFactory sessionFactory(LocalContainerEntityManagerFactoryBean emFactory) { return emFactory.getObject().unwrap(SessionFactory.class); } }
内容的提问来源于stack exchange,提问作者Nguyen Nguyen
相关产品推荐
相关产品推荐

