Hibernate - Spring项目部署更新

时间:2012-04-25 10:06:56

标签: hibernate

任何人都可以帮助我如何刷新/更新现有的,并将hibernate / Spring应用程序运行到更新的版本?

要更改源,请覆盖tomcat中的war。 在Hibernate中persistence.xml hibernate.hbm2ddl.auto = check - 这不刷新db结构,只检查。

我的问题出在数据库中。在应用程序的第二个版本中,我得到了更多不同的实体/表格结构。

如何将现有结构和数据升级到另一个? 编写SQL脚本,并直接在数据库中执行它?

是java / hibernate中表升级的任何方法吗?

由于

3 个答案:

答案 0 :(得分:1)

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

  

验证:验证架构,不对数据库进行任何更改。

     

更新:更新架构。

     

create:创建架构,销毁以前的数据。

     

create-drop:在会话结束时删除架构。

答案 1 :(得分:1)

当您使用Hibernate时,您可以利用更新或创建中设置的hbm2ddl,但在实际情况下这不适用,因为Hibernate无法按照您想要的那样更新您的数据库。例如,它可以添加列,但不能删除或重命名,因此它非常有限,而且在现实生活中,当您发布新版本的应用程序时,您可能需要更复杂的案例。

为了正确执行此操作,您需要使用特殊工具进行数据库迁移,例如flywayliquibase。您需要设置spring bean以从这些工具初始化某些类并指定您的SQL脚本位置,他们将选择那些SQL文件并使用那些尚未存在的那些更新数据库(因此他们不会重写它们)脚本两次)。

答案 2 :(得分:0)

或者,如果您不想使用其他工具,如flyway或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()) + ";");
}
祝你好运!