gpt4 book ai didi

java - 更改现有数据的 Hibernate 序列生成

转载 作者:行者123 更新时间:2023-12-01 04:21:35 25 4
gpt4 key购买 nike

我最近遇到了this behavior of Hibernate当我们尝试从身份列转向基于序列的业务实体 ID 生成时。问题是,自从第一次部署我们的应用程序以来,我们一直在 Oracle 上使用 hibernate_sequence 生成。

所以问题是:在现有生产数据库上将以下 Hibernate 参数设置为 true 是否安全,而不会弄乱已生成的 id?

hibernate.id.new_generator_mappings=true

编辑:Hibernate documentation描述该更改不向后兼容现有数据库。

我们在数据库迁移中使用 HIBERNATE_SEQUENCE.NEXTVAL ,这显然一点也不安全,因为 NEXTVAL 可能与预先存在的 ID 发生冲突。

如果我没有完全错的话,可以通过将 HIBERNATE_SEQUENCE 的当前值设置为数据库中的最大 id 来获得向后兼容性。我对么?有什么办法可以查到吗?

最佳答案

如果你想迁移到 hibernate.id.new_generator_mappings=true,你必须做两件事:

  1. 将数据库序列的增量设置为与 Hibernate 中的 allocateSize 相同的值。默认的allocationSize是50。
  2. 设置 hibernate.id.new_generator_mappings=true 后,Hibernate 将生成以 SEQ.NEXTVAL-allocationSize 开头的值。因此,您必须使用分配大小来增加序列。这意味着选择 SEQ.NEXTVAL。

这是我在迁移之前运行的 Oracle PL/SQL 脚本:

  DECLARE
v NUMBER;
BEGIN
FOR r IN (select sequence_name from user_sequences) LOOP
EXECUTE IMMEDIATE 'ALTER SEQUENCE '|| r.sequence_name ||' INCREMENT BY 50';
EXECUTE IMMEDIATE 'SELECT '|| r.sequence_name ||' .NEXTVAL FROM DUAL' INTO v;
END LOOP;
END;
/

关于java - 更改现有数据的 Hibernate 序列生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18847467/

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