我正在使用org.hibernate.tool.hbm2ddl.SchemaExport
为 PostgreSQL 上的数据库创建生成 SQL 脚本。
简化示例:
Properties entityManagerFactoryProperties = new Properties();
entityManagerFactoryProperties.put( "hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect" );
[…]
Configuration configuration = new Configuration();
configuration.setProperty( "hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect" );
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory( persistenceUnitName, entityManagerFactoryProperties );
Metamodel metamodel = entityManagerFactory.getMetamodel();
for ( final ManagedType< ? > managedType : metamodel.getManagedTypes() ) {
Class< ? > entityClass = managedType.getJavaType();
configuration.addAnnotatedClass( entityClass );
}
SchemaExport schemaExport = new SchemaExport( configuration );
schemaExport.setOutputFile( schemaFile );
schemaExport.setFormat( true );
schemaExport.setDelimiter( ";" );
schemaExport.create( true, false );
生成的架构看起来像这样
alter table TableName
drop constraint FK101841AFEA9FC;
[…]
drop table if exists TableName cascade;
[…]
create table TableName (
dbId int8 not null,
[…]
compositeSingle_dbId int8,
primary key (dbId)
);
alter table TableName
add constraint FK101841AFEA9FC
foreign key (compositeSingle_dbId)
references TableName2;
问题在于,如果数据库为空,则第一系列命令 ( ALTER TABLE
) 将失败,因为它们仅在表存在时才有意义。PostgreSQL 然后执行一个完整的回滚并且没有创建任何东西。
这只发生在约束条件下:对于表,DROP
语句被正确增强IF EXISTS
这是一个休眠错误还是我做错了什么?