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

