gpt4 book ai didi

hibernate - 从Hibernate 4迁移到5

转载 作者:行者123 更新时间:2023-12-04 16:42:39 26 4
gpt4 key购买 nike

我尝试迁移到使用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的问题

Cannot add or update a child row: a foreign key constraint fail...



如果我保持为假,我将得到相同的结果。

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

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

最佳答案

您面临的问题是,在Hibernate 4和更低版本中,使用GenerationType.AUTO意味着如果您将数据库连接到受支持的IDENTITYAUTO_INCREMENT数据类型,则与使用基于表的序列相比,这些数据库将是首选的。

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

我的建议是多步骤迁移路径,因为这将很繁琐,具体取决于表的大小和数量以及实体之间的关系。

  • 首先,不要使用新的标识符映射生成器(例如,使用false)。
  • 验证一切正常,又称现状。
  • 更改所有@GeneratedValue批注以使用GenerationType.IDENTITY
  • 更改为使用标识符映射生成器(例如,使用true)。
  • 验证一切正常,又称现状。

  • 在这一点上,您无需更改数据库中的任何内容,它像从备份中一样保留了宝贵的时间。您所做的全部工作就是迁移了Java代码,以便对于新实体,您可以使用新的标识符映射并为现有实体保留旧的方式。

    从现在开始,我建议一次迁移一个实体。
  • 更改java类以使用由hibernate_sequences表支持的命名序列生成器。
  • 确定实体数据的MAX(ID),并在hibernate_sequences表中为该实体的命名标识符设置适当的下一个ID值。
  • 这里的乏味部分是,您需要删除与此实体的现有ID列相关的所有外键,更改其数据类型,使其不是AUTO_INCREMENTIDENTITY,而最有可能是BIGINTINT。然后,您想放回外键约束。

  • 此时,该实体应开始使用序列表的逻辑,而不是使用Hibernate 5之前 AUTO_INCREMENT的 native IDENTITYAUTO功能。

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

    我必须评估我们是否为过去的项目适应了ORM5中的新标识符,并且我们确定适应一个复杂的现有模式所花费的时间是不值得的。我们结束了前1-5步以保持现状,然后允许新实体利用新事物。该计划是供开发人员根据需要在一段时间后返回并完成最后的1-3个步骤。

    关于hibernate - 从Hibernate 4迁移到5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38815625/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com