2

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

要更改源覆盖tomcat中的战争。在 Hibernate persistence.xml hibernate.hbm2ddl.auto = check - 这不刷新数据库结构,只检查。

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

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

java/hibernate中的表升级有什么方法吗?

谢谢

4

3 回答 3

1

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

validate:验证模式,不更改数据库。

更新:更新架构。

create:创建模式,销毁以前的数据。

create-drop:在会话结束时删除模式。

于 2012-04-25T10:09:19.967 回答
1

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

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

于 2012-04-25T10:28:56.467 回答
0

或者,如果您不想使用其他工具,例如 flyway 或 liquibase(它们是很棒的工具,顺便说一句),您可以hibernate.hbm2ddl.auto=update使用以下代码手动生成 Hibernate 将应用的脚本:

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()) + ";");
}

祝你好运!

于 2016-03-20T13:33:44.667 回答