簡體   English   中英

嘗試批量插入具有自動生成的ID的對象時出現NonUniqueObjectException

[英]NonUniqueObjectException when trying to batch insert Objects with Auto-Generated ID

我正在嘗試批量插入對象List 我已將ID配置為自動生成。 以前我有以下內容:

<id name="entryId" type="integer"  column="ENTRY_ID">
    <generator class="seqhilo"> 
        <param name="sequence">HB_ENTRY_ID_SEQ</param>
        <param name="max_lo">50</param>
    </generator>
</id>

我的插入查詢如下:

try (Session session = sessionFactory.openSession()) {
    session.beginTransaction();

    for (int i = 0; i < insertList.size(); i++) {
        session.save(insertList.get(i));
        if (i % 100 == 0) {
            session.flush();
            session.clear();
        }
    }

    session.getTransaction().commit();
    return insertList.size();
}

我也設置了正確的batch_size屬性值。 上面的工作正常,但是最近我將代碼更改為基於注釋,並且具有以下內容:

@Id
@Column(name = "ENTRY_ID")
@GeneratedValue(generator = "hibSeq", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name = "hibSeq", sequenceName = "HB_ENTRY_ID_SEQ", allocationSize = 100)

現在運行此命令時,插入操作將引發org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session

我一直在嘗試按照此處此處的方式理解此錯誤,但無法解決我的問題。 據我所知,在session.flush()/clear()階段發生了一些事情,導致序列生成器回收了已經使用的ID。

我究竟做錯了什么?

XML中提供的生成器與注釋指定的生成器不同。 前者是序列hilo,它將根據序列返回的值生成ID前綴。

后者采用該序列的值:它將該值和接下來的100個值保留在內存中(根據allocationSize ),這使您避免進行100次調用。 但是,在生成100個ID之后,它將調用nextval並生成與第二個條目相同的ID:

Generated ID 0 (query) .NEXTVAL
Generated ID 1 (in memory)
Generated ID 2 (in memory)
...
Generated ID 100 (in memory)
Generated ID 1 (query) .NEXTVAL

解決方案是將ALTER SEQUENCE HB_ENTRY_ID_SEQ INCREMENT BY 100

暫無
暫無

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

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