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

Spring Boot 3+Hibernate 6:编程式创建SessionFactory Bean的替代方案

Spring Boot 3 + Hibernate 6 编程式创建 SessionFactory 等价实现

在 Hibernate 6 中,LocalSessionFactoryBean已被移除,需使用 Hibernate 原生的构建API来替代。以下是你提供的 Hibernate 5 代码在 Hibernate 6 中的等价实现:

完整代码示例

import org.hibernate.SessionFactory;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.AvailableSettings;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceBuilder;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import javax.sql.DataSource;
import java.util.Properties;

@Configuration
public class HibernateConfig {

    @Bean
    DataSource getDatasource() {
        DataSourceBuilder datasource = DataSourceBuilder.create();
        datasource.username("root");
        datasource.url("jdbc:mysql://localhost:3306/mehdi");
        datasource.password("Mehdi.7465");
        return datasource.build();
    }

    @Bean
    SessionFactory sessionFactory(DataSource dataSource) {
        // 构建服务注册中心,绑定数据源与Hibernate属性
        StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
                .applySetting(AvailableSettings.DATASOURCE, dataSource)
                .applySettings(configuration())
                .build();

        // 配置实体类扫描包
        MetadataSources metadataSources = new MetadataSources(registry);
        metadataSources.addPackage("com.jewerly.onlineshop.Model");

        // 构建元数据并生成SessionFactory
        Metadata metadata = metadataSources.getMetadataBuilder().build();
        SessionFactory sessionFactory = metadata.getSessionFactoryBuilder().build();

        // 添加关闭钩子,确保应用退出时释放SessionFactory资源
        Runtime.getRuntime().addShutdownHook(new Thread(sessionFactory::close));

        return sessionFactory;
    }

    @Bean
    HibernateTransactionManager transactionManager(SessionFactory sessionFactory, DataSource dataSource) {
        HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(sessionFactory);
        transactionManager.setDataSource(dataSource);
        return transactionManager;
    }

    // Hibernate属性配置方法,可根据实际需求调整
    private Properties configuration() {
        Properties properties = new Properties();
        properties.put("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect");
        properties.put("hibernate.hbm2ddl.auto", "update");
        properties.put("hibernate.show_sql", "true");
        properties.put("hibernate.format_sql", "true");
        return properties;
    }
}

关键变化说明

  • 替换LocalSessionFactoryBean:采用 Hibernate 6 官方推荐的StandardServiceRegistryBuilder+MetadataSources+SessionFactoryBuilder组合构建SessionFactory。
  • 解决数据源缺失问题:通过AvailableSettings.DATASOURCE将 Spring 管理的DataSource直接注入到 Hibernate 配置中,确保数据源绑定生效。
  • 实体包扫描:使用metadataSources.addPackage()替代原setPackagesToScan(),实现实体类的自动扫描识别。
  • 生命周期管理:添加JVM关闭钩子,保证应用退出时SessionFactory能正确释放数据库连接等资源。
  • 事务管理器简化:直接注入已构建完成的SessionFactory实例,无需再调用getObject()方法。

内容的提问来源于stack exchange,提问作者mehdi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:37:34