从Hibernate 4迁移到5

时间:2016-08-07 15:22:30

标签: hibernate spring-boot spring-data-jpa mariadb

我尝试迁移到使用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团队通常不建议使用此设置(假值)。

如果我让hibernate生成表,看起来与备份脚本中的那些有些不同。

如果我使用关于生成器的假值并使用备份脚本并在此之后设置为true,我会遇到一些关于oreign key的问题

  

无法添加或更新子行:外键约束失败...

如果我保持虚假,我会得到相同的结果。

我可以使用什么策略迁移到Hibernate 5的新生成器并拥有旧数据库(不是结构)的数据?

有没有办法保持更通用?不是特定于Hibernate

1 个答案:

答案 0 :(得分:14)

您面临的问题是,在Hibernate 4和之前,使用GenerationType.AUTO暗示如果您将数据库连接到支持的IDENTITYAUTO_INCREMENT数据类型,那么这些数据将是首选过度使用基于表格的序列。

对于Hibernate 5,GenerationType.AUTO将默认使用以前使用IDENTITYAUTO_INCREMENT的数据库的基于表的序列。逻辑变化的原因有点复杂,但足以说有更好的选择。

我的建议是一个多步骤迁移路径,因为根据表的大小和数量以及实体之间的关系,这将是繁琐的。

  1. 首先,不要使用新的标识符映射生成器(例如,使用false)。
  2. 验证一切正常,又名状态。
  3. 更改所有@GeneratedValue注释以使用GenerationType.IDENTITY
  4. 更改为使用标识符映射生成器(例如,使用true)。
  5. 验证一切正常,又名状态。
  6. 此时,您不必更改数据库中的任何内容,它与备份中的内容保持一致。您所做的就是迁移java代码,以便对于新实体,您可以使用新的标识符映射并保留现有实体的旧方法。

    从现在开始,我建议一次迁移一个实体。

    1. 更改java类以使用由hibernate_sequences表支持的命名序列生成器。
    2. 确定实体数据的 MAX(ID),并在hibernate_sequences表中为该实体的命名标识符设置适当的下一个id值。
    3. 这里的繁琐部分是您需要删除与此实体的现有 ID 列相关的所有外键,更改其数据类型,使其不是AUTO_INCREMENT或{ {1}}但最有可能是IDENTITYBIGINT。然后你想要重新设置外键约束。
    4. 此时,该实体应该开始使用序列表的逻辑,而不是INT在Hibernate 5之前使用的AUTO_INCREMENTIDENTITY功能。

      对于大型复杂系统,这不会很有趣。

      我必须评估我们是否在ORM5中为过去的项目调整了新的标识符,我们确定了调整复杂的现有模式所需的时间并不值得。我们最终做了前1-5个步骤以保持现状,然后允许新实体利用新的东西。该计划是让开发人员回过头来,根据需要随着时间的推移完成最后的1-3个步骤。