1

我最近在尝试为我们的业务实体从身份列迁移到基于序列的 id 生成时遇到了 Hibernate 的这种行为。hibernate_sequence问题是自从我们的应用程序第一次部署以来,我们一直在 Oracle 上使用生成。

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

hibernate.id.new_generator_mappings=true

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

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

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

4

1 回答 1

0

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

  1. 将数据库序列的增量设置为与 Hibernate 中的 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;
  /
于 2014-01-10T19:37:58.203 回答