簡體   English   中英

Hibernate session.flush()導致ORA-00001:唯一約束

[英]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.

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