You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 23:32:49