【问题标题】:Change Hibernate sequence generation for existing data更改现有数据的 Hibernate 序列生成
【发布时间】:2013-09-21 18:01:30
【问题描述】:

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

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

hibernate.id.new_generator_mappings=true

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

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

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

【问题讨论】:

    标签: java oracle hibernate orm sequence


    【解决方案1】:

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

    1. 将数据库序列的增量设置为与 Hibernate 中的 allocationSize 相同的值。默认的 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;
      /
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-10
      • 2013-03-31
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      • 2013-02-26
      • 2016-03-06
      相关资源
      最近更新 更多