Hibernate 4到5的迁移

6
我将尝试迁移到使用Hibernate 5的Spring Boot 1.4版本。 我有一个MariaDB数据库的备份脚本,其中包括表的创建。
由于Spring Boot中的spring-data-jpa,我的实体正在使用以下ID生成策略。
@GeneratedValue(strategy = GenerationType.AUTO)

在我的application.properties文件中,我有以下内容:
spring.jpa.generate-ddl=true
spring.jpa.hibernate.use-new-id-generator-mappings=false

Hibernate团队通常不建议使用此设置(false值)。
如果让Hibernate生成表格,则与备份脚本中的表格存在一些区别。
如果我使用关于生成器的false值,并使用备份脚本,之后将其设置为true,那么我会遇到外键问题。
“无法添加或更新子行:外键约束失败...”
如果我保持为false,也会得到同样的结果。
我可以采用什么策略来迁移到Hibernate 5的新生成器,并拥有我的旧数据库数据(而非结构)?
有没有一种更通用的方法?而不是针对Hibernate特定的方法?
1个回答

16
您所面临的问题是,在 Hibernate 4 及更早版本中,使用 GenerationType.AUTO 意味着如果您连接的数据库支持 IDENTITYAUTO_INCREMENT 数据类型,则优先使用这些数据类型而不是基于表的序列。但在 Hibernate 5 中,GenerationType.AUTO 默认将使用基于表的序列来替代之前会使用 IDENTITYAUTO_INCREMENT 的数据库。虽然逻辑变化有点复杂,但可以肯定的是存在更好的替代方案。
我的建议是采用多步迁移路径,因为根据您的实体之间的大小和关系的不同,此过程可能会很繁琐。
1. 首先,不要使用新的标识符映射生成器(例如使用 false)。 2. 确认一切正常,即保持现状。 3. 将所有 @GeneratedValue 注释更改为使用 GenerationType.IDENTITY。 4. 更改为使用标识符映射生成器(例如使用 true)。 5. 确认一切正常,即保持现状。
到这一步为止,您没有必要在数据库中做任何更改,它应该与备份时相同。您所做的只是迁移 Java 代码,以便对于新实体,可以使用新的标识符映射并保留旧方式以处理现有实体。
从这一点开始,建议逐个迁移实体。
1. 更改 Java 类以使用由 hibernate_sequences 表支持的命名序列生成器。 2. 确定实体数据的 MAX(ID) 并为该实体的命名标识符在 hibernate_sequences 表中设置适当的下一个 ID 值。
  • 这里的繁琐之处在于,您需要删除所有与此实体的现有ID列相关的外键,将其数据类型更改为不是AUTO_INCREMENTIDENTITY,而是像BIGINTINT这样的类型。 然后,您需要重新添加外键约束。
  • 到这一步,该实体应该开始使用序列表的逻辑,而不是Hibernate 5之前AUTO使用的本地AUTO_INCREMENTIDENTITY功能。

    对于大型、复杂的系统,这并不好玩。

    我曾经评估过我们是否要为一个过去的项目调整ORM5中的新标识符事物,并且我们确定,调整复杂的现有模式所需的时间不值得。我们最终只做了前1-5个步骤以保持现状,然后允许新实体利用新的东西。计划是开发人员随着需要逐步完成最后1-3个步骤。


    1
    通过最后的1-3步,你更加紧密地与Hibernate联系在一起。我没有太多的数据,但我会检查是否有价值去做它。非常感谢。 - bernard deromme

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接