手动从数据库中的具有hibernate_sequence @GeneratedValue(strategy = GenerationType.TABLE)的表中插入数据

问题描述 投票:1回答:1

我有ID为@GeneratedValue(strategy = GenerationType.TABLE)的表。需要在postgresql生产数据库上手动插入800条记录。我们已经从oracle迁移到了postgresql,很少有用户错误地访问了旧链接和在oracle中插入的数据。请说明这种情况下如何维护hibernate_sequence。作为其生产数据库。

java oracle postgresql hibernate
1个回答
0
投票

第一步,检查您的密钥生成表和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和休眠模式如果性能很重要。

© www.soinside.com 2019 - 2024. All rights reserved.