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
相关产品推荐
相关产品推荐

