从Hibernate 4迁移到5

ber*_*mme 5 hibernate mariadb spring-data-jpa spring-boot

我尝试迁移到使用Hibernate 5的Spring Boot 1.4.我有一些包含表创建的MariaDB数据库的备份脚本.

由于Spring Boot中的spring-data-jpa,我的实体正在使用以下id生成策略.

@GeneratedValue(strategy = GenerationType.AUTO)
Run Code Online (Sandbox Code Playgroud)

在我的application.properties

spring.jpa.generate-ddl=true
spring.jpa.hibernate.use-new-id-generator-mappings=false
Run Code Online (Sandbox Code Playgroud)

Hibernate团队通常不建议使用此设置(false值).

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

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

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

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

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

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

Nar*_*ros 14

您面临的问题是,在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值.
  3. 这里繁琐的部分是你需要删除与这个实体的现有ID列相关的所有外键,改变它的数据类型,使它不是AUTO_INCREMENT或者IDENTITY更可能是类似BIGINT或者INT.然后你想要回到外键约束.

此时,该实体应该开始使用序列表的逻辑而不是Hibernate 5之前使用的本机AUTO_INCREMENTIDENTITY功能AUTO.

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

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