Java 更改现有数据的休眠序列生成
我最近在尝试为我们的业务实体从标识列转换为基于序列的标识生成时遇到了这个问题。问题是,自从应用程序首次部署以来,我们一直在Oracle上使用hibernate_序列生成 因此,问题是:在现有生产数据库上将以下Hibernate参数设置为true而不破坏已经生成的ID安全吗Java 更改现有数据的休眠序列生成,java,oracle,hibernate,orm,sequence,Java,Oracle,Hibernate,Orm,Sequence,我最近在尝试为我们的业务实体从标识列转换为基于序列的标识生成时遇到了这个问题。问题是,自从应用程序首次部署以来,我们一直在Oracle上使用hibernate_序列生成 因此,问题是:在现有生产数据库上将以下Hibernate参数设置为true而不破坏已经生成的ID安全吗 hibernate.id.new_generator_mappings=true 编辑: 描述更改与现有数据库不向后兼容 我们在数据库迁移中使用HIBERNATE_SEQUENCE.NEXTVAL,这显然是不安全的,因为NE
hibernate.id.new_generator_mappings=true
编辑:
描述更改与现有数据库不向后兼容
我们在数据库迁移中使用HIBERNATE_SEQUENCE.NEXTVAL,这显然是不安全的,因为NEXTVAL可能与预先存在的id冲突
如果我没有大错特错的话,可以通过将HIBERNATE_序列的当前值设置为数据库中的最大id来获得向后兼容性。我说得对吗?有没有办法找到答案?如果您想迁移到hibernate.id.new\u generator\u mappings=true,您必须做两件事: 将数据库序列的增量设置为与Hibernate中的allocationSize相同的值。默认的allocationSize为50。 设置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;
/