2011-10-07 27 views
2

我試圖將生成的DDL導出到輸出文件,而不是在命令提示符中直接顯示hbm2ddl.auto = update(使用自動模式生成)。休眠:使用hbm2ddl工具中的update =「true」和outputfilename生成DDl到輸出文件

我知道這可能不是一個好主意,使用此生產數據庫生成架構。我已經通過討論它的線索了。

Hibernate: hbm2ddl.auto=update in production?

我想利用這個對於開發/測試數據庫。

但是,我在這裏面臨的挑戰是它不發出生成的DDL到一個輸出文件,即使我現在用的是「outputfilename」屬性,就是hbm2ddl
出口國。 (按照這個http://docs.jboss.org/tools/2.1.0.Beta1/hibernatetools/html/ant.html

這是我的build.xml的樣子。我正在使用Hibernate的Jpa配置。

<taskdef name="hibernatetool" classname="org.hibernate.tool.ant.HibernateToolTask"  classpathref="classpath.hibernate" /> 

<target name="db_update_schema_sql" depends="db_config" 
     description="create SQL script for updating schema"> 
    <hibernatetool destdir="${out.dir}"> 
     <jpaconfiguration persistenceunit="${persistence.unit.name}"/> 
     <classpath path="${build.classes.dir}"/>    
     <hbm2ddl export="false" create="false" update="true" drop="false"  outputfilename="update.sql" delimiter=";" format="true"/>   
    </hibernatetool> 
</target> 

<target name="db_full_update" depends="db_config" description="Updates database"> 
    <antcall target="db_update_schema_sql" /> 
</target> 

當我設置update =「true」時,從不創建/更新「update.sql」。當我使用create =「true」或drop =「true」或兩者時,它只創建/更新。

我對此進行了一點挖掘。我在Hibernate Jira中發現了一些與此相關的問題。它仍然說它沒有解決。有一個補丁可用於此。不確定
是否有人使用過這個補丁。

https://hibernate.onjira.com/browse/HHH-1186 https://hibernate.onjira.com/browse/HBX-757

如果有人使用此更新=「真」功能直接將文件生成DDL向我解釋,他們是怎麼做到的我會很感激。另外,如果你使用這個補丁,你能告訴我你是如何將補丁應用到現有的Jar文件的。

感謝, SM

回答

0

只需直接使用相關的類。

Connection connection = DriverManager.getConnection(dbUrl, dbUsername, dbPassword); 
connection.setSchema (dbSchema); 
Dialect dialect = ...; // eg, new MySQL5InnoDBDialect(); 
DatabaseMetadata metadata = new DatabaseMetadata(connection, dialect, null); 

Configuration cfg = new Configuration(); 
cfg.addAnnotatedClass(...); // or read from xml 
cfg.buildMappings(); 
List<SchemaUpdateScript> updateScritps = cfg.generateSchemaUpdateScriptList(dialect, metadata); 

for (SchemaUpdateScript script : updateScritps) 
{ 
    String formatted = FormatStyle.DDL.getFormatter().format (script.getScript()); 

    // Replace with writing to file: 
    System.out.println(formatted + ";"); 
} 

程序員是爲了編程而不是打敗他們對XML的頭腦。

同時查看org.hibernate.tool.hbm2ddl.SchemaUpdate的源代碼。