首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Hibernate 4迁移到5

从Hibernate 4迁移到5
EN

Stack Overflow用户
提问于 2016-08-07 15:22:30
回答 1查看 10.3K关注 0票数 6

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

由于Spring在Spring中,我的实体使用了以下id生成策略。

代码语言:javascript
复制
@GeneratedValue(strategy = GenerationType.AUTO)

在我的application.properties

代码语言:javascript
复制
spring.jpa.generate-ddl=true
spring.jpa.hibernate.use-new-id-generator-mappings=false

Hibernate团队通常不推荐此设置(false值)。

如果让hibernate生成表,似乎与备份脚本中的表有一些不同。

如果我使用了生成器的虚值,并使用备份脚本,然后将其设置为true,我就会得到关于some key的一些问题。

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

如果我坚持错误的话,我会得到同样的结果。

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

有什么办法能保持更通用吗?不限于Hibernate

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-07 19:48:44

您面临的问题是,在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. 确定实体数据的最大值( id ),并在hibernate_sequences表中为该实体的命名标识符设置适当的下一个id值。
  3. 这里冗长的部分是,您需要删除与该实体的现有ID列相关的所有外键,更改其数据类型,使其不是AUTO_INCREMENTIDENTITY,而是很可能类似于BIGINTINT。然后要将外键约束放回。

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

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

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

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38815625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档