我有ID为@GeneratedValue(strategy = GenerationType.TABLE)的表。需要在postgresql生产数据库上手动插入800条记录。我们已经从oracle迁移到了postgresql,很少有用户错误地访问了旧链接和在oracle中插入的数据。请说明这种情况下如何维护hibernate_sequence。作为其生产数据库。
第一步,检查您的密钥生成表和SEQUENCE_NAME
。
如果使用默认设置,您将看到以下内容-根据不同的配置调整其他步骤。
select * from hibernate_sequences;
SEQUENCE_NAME NEXT_VAL
--------------- ----------
default nnnnn
现在将NEXT_VAL
增加所请求的跳过记录数。为了避免通过Hibernate进行并发插入的问题,我使用LOCK TABLE
-在完成以下操作之前,所有从Hibernate进行的插入都将被阻止。
lock table hibernate_sequences in exclusive mode;
select * from hibernate_sequences;
-- remember the value of NEXT_VAL nnnn
update hibernate_sequences
set NEXT_VAL = NEXT_VAL + 800
where SEQUENCE_NAME = 'default';
commit;
现在您有800 ID
的nnnn + 1 .. nnnn + 800用于跳过的行。
请注意,如果您与表LOCK
的所有者连接,则hibernate_sequences
将起作用。如果应用程序关闭并且无法执行插入,则可以完全跳过LOCK
。
使用与在休眠INSERT
中看到的相同的show_sql
,并使数据传递保留的ID。
示例
-- Hibernate: insert into AUTHOR (name, AUTHOR_ID) values (?, ?)
insert into AUTHOR (name, AUTHOR_ID) values ('Psik', nnnn +1);
insert into AUTHOR (name, AUTHOR_ID) values ('Tuzka', nnnn+2);
警告
如注释中所述,您应该计划切换到SEQUENCE
映射,这将使跳过的行的添加更加简单。另请参阅why-you-should-never-use-the-table-identifier-generator-with-jpa-and-hibernate。
已经说过,TABLE
生成器可以在某些用例中正常工作,例如并发插入数量少。使用类似的论点,声明可能是:为什么不应该使用jpa和休眠模式如果性能很重要。