我尝试迁移到使用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
答案 0 :(得分:14)
您面临的问题是,在Hibernate 4和之前,使用GenerationType.AUTO
暗示如果您将数据库连接到支持的IDENTITY
或AUTO_INCREMENT
数据类型,那么这些数据将是首选过度使用基于表格的序列。
对于Hibernate 5,GenerationType.AUTO
将默认使用以前使用IDENTITY
或AUTO_INCREMENT
的数据库的基于表的序列。逻辑变化的原因有点复杂,但足以说有更好的选择。
我的建议是一个多步骤迁移路径,因为根据表的大小和数量以及实体之间的关系,这将是繁琐的。
false
)。@GeneratedValue
注释以使用GenerationType.IDENTITY
。 true
)。此时,您不必更改数据库中的任何内容,它与备份中的内容保持一致。您所做的就是迁移java代码,以便对于新实体,您可以使用新的标识符映射并保留现有实体的旧方法。
从现在开始,我建议一次迁移一个实体。
hibernate_sequences
表支持的命名序列生成器。hibernate_sequences
表中为该实体的命名标识符设置适当的下一个id值。AUTO_INCREMENT
或{ {1}}但最有可能是IDENTITY
或BIGINT
。然后你想要重新设置外键约束。此时,该实体应该开始使用序列表的逻辑,而不是INT
在Hibernate 5之前使用的AUTO_INCREMENT
或IDENTITY
功能。
对于大型复杂系统,这不会很有趣。
我必须评估我们是否在ORM5中为过去的项目调整了新的标识符,我们确定了调整复杂的现有模式所需的时间并不值得。我们最终做了前1-5个步骤以保持现状,然后允许新实体利用新的东西。该计划是让开发人员回过头来,根据需要随着时间的推移完成最后的1-3个步骤。