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

Hibernate 6中SchemaExport与SchemaUpdate类找不到问题求助

问题

我使用以下代码导出JPA实体的Schema DDL:

import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.hibernate.tool.hbm2ddl.SchemaUpdate;

public class HibernateQueryGenerator {
    public static void main(String[] args) {
//        createSchema();
        updateSchema();
    }

    private static void addEntityClass(MetadataSources metadata) {
        // Scan entity packages and use : 
        // metadata.addAnnotatedClass(...);
    }

    private static void updateSchema() {
        MetadataSources metadata = getMetadataSources();
        SchemaUpdate schemaUpdate = new SchemaUpdate();
        schemaUpdate.setHaltOnError(true);
        schemaUpdate.setFormat(false);
        schemaUpdate.setDelimiter(";");
        schemaUpdate.execute(EnumSet.of(TargetType.STDOUT), metadata.buildMetadata());
    }

    private static void createSchema() {
        MetadataSources metadata = getMetadataSources();
        SchemaExport schemaExport = new SchemaExport();
        schemaExport.setHaltOnError(true);
        schemaExport.setFormat(false);
        schemaExport.setDelimiter(";");
        schemaExport.execute(EnumSet.of(TargetType.STDOUT), SchemaExport.Action.CREATE, metadata.buildMetadata());
    }

    private static MetadataSources getMetadataSources() {
        MetadataSources metadata = new MetadataSources(
                new StandardServiceRegistryBuilder()
                        .applySettings(getSettings())
                        .build());
        addEntityClass(metadata);
        return metadata;
    }

    private static Map<String, String> getSettings() {
        Map<String, String> settings = new HashMap<>();
        settings.put("connection.driver_class", "org.postgresql.Driver");
        settings.put("dialect", "org.hibernate.dialect.PostgreSQL10Dialect");
        settings.put("hibernate.connection.url", "jdbc:postgresql://172.22.0.3:5432/tutorial");
        settings.put("hibernate.connection.username", "admin");
        settings.put("hibernate.connection.password", "adminpass");
        return settings;
    }
}         

但在Hibernate 6中无法找到SchemaExport和SchemaUpdate类,请问这些类是否已被废弃?对应的替代方案是什么?

回答

是的,SchemaExport和SchemaUpdate在Hibernate 6中已被废弃,官方推荐使用SchemaManager类替代,它整合了原有两个类的功能,提供了更统一的Schema操作API。

替代实现示例

以下是适配Hibernate 6的修改后代码,替换原有的createSchema和updateSchema方法:

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.SchemaManager;
import org.hibernate.tool.schema.TargetType;

import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;

public class HibernateQueryGenerator {
    public static void main(String[] args) {
//        createSchema();
        updateSchema();
    }

    private static void addEntityClass(MetadataSources metadata) {
        // 扫描实体包并添加类,例如:
        // metadata.addAnnotatedClass(User.class);
    }

    private static void updateSchema() {
        StandardServiceRegistry registry = getServiceRegistry();
        Metadata metadata = new MetadataSources(registry).buildMetadata();
        
        // 构建SchemaManager并执行更新
        SchemaManager schemaManager = SchemaManager.create(registry, metadata);
        schemaManager.update(EnumSet.of(TargetType.STDOUT));
    }

    private static void createSchema() {
        StandardServiceRegistry registry = getServiceRegistry();
        Metadata metadata = new MetadataSources(registry).buildMetadata();
        
        // 构建SchemaManager并执行创建
        SchemaManager schemaManager = SchemaManager.create(registry, metadata);
        schemaManager.create(EnumSet.of(TargetType.STDOUT));
    }

    private static StandardServiceRegistry getServiceRegistry() {
        return new StandardServiceRegistryBuilder()
                .applySettings(getSettings())
                .build();
    }

    private static Map<String, String> getSettings() {
        Map<String, String> settings = new HashMap<>();
        settings.put("connection.driver_class", "org.postgresql.Driver");
        settings.put("dialect", "org.hibernate.dialect.PostgreSQLDialect"); // Hibernate 6推荐使用此方言
        settings.put("hibernate.connection.url", "jdbc:postgresql://172.22.0.3:5432/tutorial");
        settings.put("hibernate.connection.username", "admin");
        settings.put("hibernate.connection.password", "adminpass");
        return settings;
    }
}

关键说明

  • SchemaManager整合了创建、更新、验证、删除Schema的所有操作,API更简洁统一
  • 可直接通过create、update、validate、drop等方法执行对应Schema操作
  • 如果需要精细配置(如SQL分隔符、格式化开关),可通过SchemaManagementToolCoordinator自定义:
import org.hibernate.tool.schema.spi.SchemaManagementTool;
import org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator;

// 自定义配置示例
Map<String, Object> config = new HashMap<>();
config.put("hibernate.hbm2ddl.delimiter", ";");
config.put("hibernate.hbm2ddl.format", false);

SchemaManagementTool tool = registry.getService(SchemaManagementTool.class);
SchemaManagementToolCoordinator.process(
        metadata,
        registry,
        config,
        (metadataImplementor, serviceRegistry) -> tool.getSchemaCreator(serviceRegistry)
                .doCreation(metadataImplementor, serviceRegistry, config, EnumSet.of(TargetType.STDOUT))
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 06:25:38