3

org.hibernate.tool.hbm2ddl.SchemaExportPostgreSQL で DB を作成するための 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 のバグですか、それとも何か間違っていますか?

4

1 に答える 1

2

それ以外の

schemaExport.create( true, false );

電話

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

変更/削除ステートメントなしで DDL を作成します

(詳細は javadoc を参照してくださいhttp://docs.jboss.org/hibernate/orm/3.3/api/org/hibernate/tool/hbm2ddl/SchemaExport.html )

于 2013-02-05T22:34:15.187 に答える