簡體   English   中英

手動將數據庫中的數據插入到具有 hibernate_sequence @GeneratedValue(strategy = GenerationType.TABLE) 的表中

[英]Manually insert Data from database in table which has hibernate_sequence @GeneratedValue(strategy = GenerationType.TABLE)

我有 ID 為 @GeneratedValue(strategy = GenerationType.TABLE) 的表。 Need to insert 800 records manually on postgresql production database.We had migration from oracle to postgresql, few User mistakenly access old link and data inserted in 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 用於您跳過的行。

請注意,如果您與表hibernate_sequences的 OWNER 連接,則LOCK將起作用。 如果應用程序關閉並且無法執行插入,您可以完全跳過LOCK

使用與您在 Hibernate show_sql中看到的相同的INSERT ,並使用您的數據傳遞保留的 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映射,這將使跳過的行的添加更加簡單。 另請參閱為什么您應該從不使用-table-identifier-generator-with-jpa-and-hibernate

話雖如此, TABLE生成器在某些用例(例如並發插入數量較少的情況下)可以正常工作。 使用類似的論據,該主張可能是:如果性能很重要,為什么您應該從不使用-jpa-and-hibernate

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM