2012-04-25 42 views
2

任何人都可以幫助我如何刷新/更新現有的,並運行hibernate/Spring應用程序到一個更新的版本?Hibernate - Spring項目部署更新

改變源代碼在tomcat中重寫war。 在Hibernate persistence.xml中hibernate.hbm2ddl.auto = check - 並且這個不刷新數據庫結構,只檢查。

我的問題是在數據庫中。在應用程序的第二個版本中,我得到了更多不同的實體/表結構。

如何將現有結構和數據升級到另一個? 編寫SQL腳本,並直接在數據庫中執行它?

java/hibernate中的表升級是否有任何方法?

感謝

+0

可能重複的[Hibernate問題hbm2ddl.auto可能的值和他們做什麼](http://stackoverflow.com/questions/438146/hibernate-question-hbm2ddl-auto-possible-values-and-what-they- ) – NimChimpsky 2012-04-25 10:09:45

回答

1

當你與Hibernate一起工作,你可以在更新利用就是hbm2ddl集或創建,但這並不適合在現實情況下,因爲Hibernate不能作爲想更新數據庫。例如,它可以添加列,但不能刪除或重命名,因此它非常有限,而在現實生活中,當您發佈新版本的應用程序時,您可能需要更復雜的案例。

爲了正確執行此操作,您需要使用特殊工具進行數據庫遷移,如flywayliquibase。你需要設置你的spring beans來從這些工具初始化一些類並指定你的SQL腳本位置,他們將選擇那些SQL文件並用那些還沒有的SQL數據庫更新數據庫(所以它們不會重寫相同的腳本兩次)。

+1

非常感謝,flyway對我來說非常好。 我可以在maven中使用它,或者在春天,它看起來非常好。謝謝。 – Barnabas 2012-04-25 15:28:12

1

https://stackoverflow.com/a/1689769/106261

驗證:驗證模式,不更改數據庫。

更新:更新模式。

create:創建模式,破壞以前的數據。

create-drop:在會話結束時刪除架構。

+0

謝謝,但我知道,而我的querstion不是這個。 – Barnabas 2012-04-25 15:21:07

0

或者,如果你不想使用像遷徙路線或liquibase其他工具(這是偉大的工具,順便說一句),您可以手動生成Hibernate會施加hibernate.hbm2ddl.auto=update用下面的代碼腳本:

LocalSessionFactoryBuilder sessionFactory = new LocalSessionFactoryBuilder(dataSource); 
sessionFactory.scanPackages("your.package.containing.entities"); 
Dialect dialect = new MySQL5Dialect(); // select your dialect 
DatabaseMetadata metadata = new DatabaseMetadata(dataSource.getConnection(), dialect, sessionFactory); 
List<SchemaUpdateScript> scripts = sessionFactory.generateSchemaUpdateScriptList(dialect, metadata); 

Formatter formatter = FormatStyle.DDL.getFormatter(); 
for (SchemaUpdateScript script : scripts) { 
    System.err.println(formatter.format(script.getScript()) + ";"); 
} 

祝你好運!