[英]Hibernate session.flush() causes ORA-00001: unique constraint
我有這種方法,可以使用休眠方式將數千條記錄插入數據庫。
根據本文 ,刷新和清除有助於釋放一些寶貴的內存,下面的代碼每100條記錄執行一次。 但是問題是:
ORA-00001:違反了唯一約束(OWNER.FOO_TABLE_PK)
總是在調用代碼session.flush()時發生,這是在第100次保存之后(FOO_TABLE的PK是一個簡單的長id)。 我試圖完全刪除session.flush()和session.clear(),並在session.save()之后添加session.evict(obj),從而解決了問題。 我不確定這是否是一個好習慣。
你們知道為什么session.flush()會導致唯一約束錯誤嗎? 強烈建議定期進行沖洗和清除,但是我不確定是否正確使用它們。 任何輸入將不勝感激。 謝謝!
@Override
@Transactional
public void bulkSave(List<Foo> objList) {
Session session = sessionFactory.getCurrentSession();
if (objList != null) {
if (!objList.isEmpty()) {
int counter = 0;
for (Foo obj : objList) {
session.save(objList);
counter++;
if ((counter % 100) == 0) {
session.flush();
session.clear();
}
}
}
}
}
良好的刷新會導致狀態刷新到數據庫。 如果存在主鍵沖突,則為對象分配主鍵的方式有問題。
經過更深入的調查,我確定這不是Hibernate的錯。 Hibernate使用ID序列生成器提供的數字作為主鍵。 有人手動上傳了測試數據,該數據使用了序列生成器未提供的ID。 最終,在陷入休眠狀態時,它無法使用生成器提供的ID,因為該ID已存在於數據庫中,因此session.flush()之后違反了唯一約束。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.