我最近遇到了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,你必须做两件事:
- 将数据库序列的增量设置为与 Hibernate 中的 allocateSize 相同的值。默认的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;
/
关于java - 更改现有数据的 Hibernate 序列生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18847467/