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

标签 java oracle hibernate orm sequence

我最近遇到了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/

相关文章:

java - 如何在p2p应用程序中随机选择谁开始游戏/聊天?

java - 为文本编辑器实现保存

java - Tomcat8 加载错误的 SQL Server 驱动程序/未找到 SQLServerXADataSource

oracle - 查询适用于 oracle 12c 但不适用于 11g

java - hibernate 事务和 sql 查询与条件查询

java - 为什么 DataoutputStream 和 BufferedWriter 创建顺序很重要?

oracle - 无法加载 oracle.so

oracle - PL/SQL XML 解析为关系表

sql - 查询、 native 查询、命名查询和类型化查询之间的区别

java - 使用 JPA 处理 Spring、Hibernate 中的脏读