問(wèn)題:org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:……
主鍵不唯一,,在事務(wù)的最后執(zhí)行SQL時(shí),,session緩存里面有多個(gè)(>1)主鍵一樣的對(duì)象。
原因:了解過(guò)hibernate的都知道它有一個(gè)一級(jí)緩存,,即session級(jí)別的緩存,,在一個(gè)事務(wù)的執(zhí)行過(guò)程中可以管理持久化對(duì)象,在事務(wù)最后執(zhí)行SQL,,可以減少數(shù)據(jù)庫(kù)的操作,。 可能的場(chǎng)景: 1、同一個(gè)object,,如一個(gè)person在seession里保存了一份,,而增加的別的object,如company的時(shí)候,,由于做了關(guān)聯(lián)關(guān)系,,從數(shù)據(jù)庫(kù)里又get了一個(gè)person,而這個(gè)person和seession里的person是同一個(gè),把get出來(lái)的person
set 到了company里,,像這樣,,compnay.setPerson(person).在增加company的時(shí)候就出現(xiàn)了這個(gè)錯(cuò)誤。 2,、在同一個(gè)session內(nèi),,如果已經(jīng)有一個(gè)對(duì)象已經(jīng)是持久化狀態(tài)(load進(jìn)來(lái)等),現(xiàn)在構(gòu)造一個(gè)新的PO,,和前一個(gè)持久化對(duì)象擁有相同的持久化標(biāo)識(shí)(identifier),,在update的時(shí)候,就會(huì)拋這個(gè)錯(cuò)誤,。如:
3,、。。,。。,。
解決辦法: 1.不要重新new一個(gè)對(duì)象,,使用load的對(duì)象對(duì)他進(jìn)行更改值。
參考http:///2011/04/org-hibernate-nonuniqueobjectexception.html
|
|
來(lái)自: Bladexu的文庫(kù) > 《技術(shù)問(wèn)題》