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

从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;
    }
}

补充说明

  1. XML配置文件适配:建议将原DTD地址更新为Hibernate 6兼容版本(原地址仍可兼容,但新地址更稳定):
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "https://hibernate.org/dtd/hibernate-configuration-3.0.dtd">
  1. 原execute参数映射:原 execute(false, true) 中的两个布尔值分别对应:
    • false:不格式化SQL → 对应新API中 ExecutionOptions.isFormat() 返回 false
    • true:遇错误停止执行 → 对应新API中 ExecutionOptions.isHaltOnError() 返回 true
      上面的示例代码通过 SchemaUpdate.create() 自动继承了配置中的行为,若需自定义可手动实现 ExecutionOptions。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:17:54