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