【问题标题】:Hibernate - Spring project deploy updateHibernate - Spring 项目部署更新
【发布时间】:2012-04-25 10:06:55
【问题描述】:

谁能帮助我如何刷新/更新现有的、正在运行的 hibernate/Spring 应用程序到较新的版本?

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

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

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

有没有java/hibernate中表升级的方法?

谢谢

【问题讨论】:

标签: hibernate


【解决方案1】:

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

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

【讨论】:

  • 非常感谢,flyway 看起来非常适合我。我可以在 maven 中使用它,或者在 spring 中使用它,它看起来非常好。谢谢。
【解决方案2】:

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

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

更新:更新架构。

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

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

【讨论】:

  • 谢谢,但我知道,我的问题不是这个。
【解决方案3】:

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

祝你好运!

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 2017-07-18
    • 1970-01-01
    • 2013-09-27
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多