我尝试迁移到使用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团队通常不建议使用此设置(错误值)。
如果我让休眠生成表,似乎与备份脚本中的表有些不同。
如果我对生成器使用假值并使用备份脚本,然后将其设置为true,则会遇到有关Oreign Key的问题
无法添加或更新子行:外键约束失败...
如果我保持为假,我将得到相同的结果。
我可以使用什么策略迁移到Hibernate 5的新生成器并拥有旧数据库(而不是结构)的数据?
有没有办法保持更通用?不特定于休眠
您面临的问题是在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
或IDENTITY
而是最有可能类似于BIGINT
或INT
。然后,您想放回外键约束。此时,该实体应开始使用序列表的逻辑,而不是使用Hibernate 5之前的本机AUTO_INCREMENT
或IDENTITY
功能AUTO
。
对于大型,复杂的系统,这不会很有趣。
我必须评估我们是否为过去的项目适应了ORM5中的新标识符,并且我们确定适应一个复杂的现有模式所花费的时间是不值得的。我们结束了前1-5步以保持现状,然后允许新实体利用新事物。该计划是供开发人员根据需要在一段时间后返回并完成最后的1-3个步骤。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句