从Hibernate 3升级到6:运行时基于映射升级hbm2ddl Schema创建
Hibernate 6 替代原 SchemaUpdate 实现指定映射的 Schema 生成
Hibernate 6 对 Schema 生成工具做了大幅重构,原 org.hibernate.tool.hbm2ddl.SchemaUpdate 的构造器和用法已完全废弃,下面是适配你需求的替代实现方案:
核心变化说明
- 原基于
Configuration的 Schema 更新逻辑,需替换为基于StandardServiceRegistry和Metadata的新API SchemaUpdate不再直接接收配置参数,需通过Metadata(包含映射元数据)和ServiceRegistry(包含连接配置)来初始化
改造后的完整代码
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.tool.schema.SchemaUpdate; import org.hibernate.tool.schema.TargetType; public class SchemaGenerator { private Metadata metadata; private void create() { Metadata metadata = getMetadata(); // 创建SchemaUpdate实例并执行更新 SchemaUpdate schemaUpdate = SchemaUpdate.create( metadata.getSessionFactoryOptions(), metadata ); // 对应原execute(false, true):不格式化SQL、遇错误停止 schemaUpdate.execute( TargetType.DATABASE, metadata ); } private Metadata getMetadata() { if (metadata == null) { // 构建服务注册器,加载配置属性 StandardServiceRegistryBuilder registryBuilder = new StandardServiceRegistryBuilder(); registryBuilder.applySetting("hibernate.connection.driver_class", driverClassName); registryBuilder.applySetting("hibernate.connection.url", url); registryBuilder.applySetting("hibernate.connection.username", username); registryBuilder.applySetting("hibernate.connection.password", password); registryBuilder.applySetting("hibernate.dialect", hibernateDialect); registryBuilder.applySetting("hibernate.jdbc.batch_size", Integer.toString(CommonConstants.JDBC_BATCH_SIZE)); registryBuilder.applySetting("hibernate.connection.provider_class", "org.hibernate.connection.C3P0ConnectionProvider"); registryBuilder.applySetting("hibernate.connection.autocommit", "true"); registryBuilder.applySetting("hibernate.default_schema", username); registryBuilder.applySetting("hibernate.hbm2ddl.auto", "create"); // 加载你的XML配置文件(包含映射类配置) registryBuilder.configure(configFile); StandardServiceRegistry registry = registryBuilder.build(); // 构建元数据,确保包含所有实体映射 MetadataSources sources = new MetadataSources(registry); // 若XML中已配置<mapping class>,此步可省略;手动添加是为了确保映射被加载 sources.addAnnotatedClass(org.application.hibernate.Table.class); metadata = sources.buildMetadata(); } return metadata; } }
补充说明
- XML配置文件适配:建议将原DTD地址更新为Hibernate 6兼容版本(原地址仍可兼容,但新地址更稳定):
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "https://hibernate.org/dtd/hibernate-configuration-3.0.dtd">
- 原execute参数映射:原
execute(false, true)中的两个布尔值分别对应:false:不格式化SQL → 对应新API中ExecutionOptions.isFormat()返回falsetrue:遇错误停止执行 → 对应新API中ExecutionOptions.isHaltOnError()返回true
上面的示例代码通过SchemaUpdate.create()自动继承了配置中的行为,若需自定义可手动实现ExecutionOptions。
内容的提问来源于stack exchange,提问作者Dialvive
相关产品推荐
相关产品推荐

