org.hibernate.tool.hbm2ddl.SchemaExport和PostgreSQL

时间:2013-01-14 07:40:28

标签: hibernate postgresql database-schema

我正在使用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语句

这是一个Hibernate错误还是我做错了什么?

1 个答案:

答案 0 :(得分:2)

而不是

schemaExport.create( true, false );

呼叫

schemaExport.execute(true, false, false, true)

它将创建没有alter / drop语句的DDL

(有关详细信息,请参阅javadoc http://docs.jboss.org/hibernate/orm/3.3/api/org/hibernate/tool/hbm2ddl/SchemaExport.html