任何人都可以帮助我如何刷新/更新现有的,并将hibernate / Spring应用程序运行到更新的版本?
要更改源,请覆盖tomcat中的war。 在Hibernate中persistence.xml hibernate.hbm2ddl.auto = check - 这不刷新db结构,只检查。
我的问题出在数据库中。在应用程序的第二个版本中,我得到了更多不同的实体/表格结构。
如何将现有结构和数据升级到另一个? 编写SQL脚本,并直接在数据库中执行它?
是java / hibernate中表升级的任何方法吗?
由于
答案 0 :(得分:1)
https://stackoverflow.com/a/1689769/106261
验证:验证架构,不对数据库进行任何更改。
更新:更新架构。
create:创建架构,销毁以前的数据。
create-drop:在会话结束时删除架构。
答案 1 :(得分:1)
当您使用Hibernate时,您可以利用更新或创建中设置的hbm2ddl,但在实际情况下这不适用,因为Hibernate无法按照您想要的那样更新您的数据库。例如,它可以添加列,但不能删除或重命名,因此它非常有限,而且在现实生活中,当您发布新版本的应用程序时,您可能需要更复杂的案例。
为了正确执行此操作,您需要使用特殊工具进行数据库迁移,例如flyway或liquibase。您需要设置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()) + ";");
}
祝你好运!