首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在表中手动插入数据库中的数据,该表具有hibernate_sequence @GeneratedValue(策略= GenerationType.TABLE)

在表中手动插入数据库中的数据,该表具有hibernate_sequence @GeneratedValue(策略= GenerationType.TABLE)
EN

Stack Overflow用户
提问于 2020-04-09 21:05:53
回答 1查看 459关注 0票数 1

我有一个ID为@GeneratedValue(策略= GenerationType.TABLE)的表。在postgresql production database.We上需要手动插入800条记录才能从oracle迁移到postgresql,很少有用户错误地访问oracle中插入的旧链接和数据。请解释一下在这种情况下如何维护hibernate_sequence。作为它的生产数据库。

EN

回答 1

Stack Overflow用户

发布于 2020-04-12 17:05:18

在第一步中,检查密钥生成表和SEQUENCE_NAME

如果您使用默认设置,您将看到以下内容-针对不同的配置调整后续步骤。

代码语言:javascript
复制
select * from hibernate_sequences;

SEQUENCE_NAME   NEXT_VAL
--------------- ----------
default         nnnnn

现在,将NEXT_VAL增加所请求的跳过记录数。为了避免通过Hibernate并发插入的问题,我使用了LOCK TABLE -所有来自Hibernate的插入都会被阻止,直到您完成下面的操作。

代码语言:javascript
复制
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用于您跳过的行。

请注意,如果您与表hibernate_sequences__的所有者连接,则LOCK将工作。如果应用程序关闭并且无法执行任何插入操作,则可以完全跳过LOCK

使用与您在Hibernate show_sql中看到的相同的INSERT,并使用您的数据传递保留ID。

示例

代码语言:javascript
复制
-- 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生成器可以很好地适用于某些用例,例如并发插入数量较少的情况。使用类似的论证,声明可以是:如果性能很重要,则为。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61121870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档