原因:集合被多個(gè)實(shí)體共享
發(fā)生的地方在saveAll()方法,
排除了網(wǎng)上常見(jiàn)的淺拷貝的原因盖腿,因?yàn)槊總€(gè)保存的實(shí)體中的list都是new出來(lái)的钉凌。
仔細(xì)研究原因
發(fā)現(xiàn)是在org.hibernate.engine.internal.Collections類(lèi)里面拋出的異常,然后跟蹤發(fā)現(xiàn)
該處不僅會(huì)判斷新save的實(shí)體帐偎,還會(huì)判斷數(shù)據(jù)庫(kù)中已經(jīng)存在的實(shí)體Q指巍!肮街!
兩條記錄的list關(guān)聯(lián)字段相同的話(huà)风题,查出來(lái)的list是同一個(gè)。所以關(guān)聯(lián)字段需要設(shè)置唯一索引嫉父。
查詢(xún)數(shù)據(jù)庫(kù)沛硅,發(fā)現(xiàn)數(shù)據(jù)庫(kù)中真的存在重復(fù)數(shù)據(jù)
解決如下:
首先去重
delete t1
from my_item_code_new t1,
(select max(id)as id,org_id,item_code from my_item_code_newgroup by org_id,item_code having count(*) >1) t2
where t1.org_id = t2.org_id
? and t1.item_code = t2.item_code
? and t1.id < t2.id;
然后設(shè)置唯一索引,避免以后再次發(fā)生這種情況绕辖。
再次保存時(shí)成功摇肌。