我遇到一種情況,我需要將分離的對象重新附加到休眠會話,盡管會話中可能已經(jīng)存在相同標(biāo)識的對象,這將導(dǎo)致錯誤。現(xiàn)在,我可以做兩件事之一。getHibernateTemplate().update( obj ) 當(dāng)且僅當(dāng)休眠會話中不存在對象時,此方法才有效。當(dāng)以后需要時,會拋出異常,說明會話中已經(jīng)存在具有給定標(biāo)識符的對象。getHibernateTemplate().merge( obj ) 僅當(dāng)休眠會話中存在對象時,此方法才有效。如果我以后使用該對象,則當(dāng)我需要該對象進(jìn)入會話時,將引發(fā)異常。在這兩種情況下,如何將會話附加到對象上?我不想使用異常來控制此問題的解決方案的流程,因為必須有一個更優(yōu)雅的解決方案...
3 回答

互換的青春
TA貢獻(xiàn)1797條經(jīng)驗 獲得超6個贊
如果您確定您的實體尚未被修改(或者如果您同意任何修改將丟失),則可以使用鎖定將其重新連接到會話。
session.lock(entity, LockMode.NONE);
它不會鎖定任何內(nèi)容,但是會從會話緩存中獲取實體,或者(如果未在其中找到)從數(shù)據(jù)庫讀取實體。
當(dāng)您從“舊”(例如HttpSession)實體導(dǎo)航關(guān)系時,防止LazyInitException非常有用。您首先要“重新附加”實體。
使用get也可能會起作用,除非您繼承映射時(繼承已在getId()上引發(fā)異常)。
entity = session.get(entity.getClass(), entity.getId());
添加回答
舉報
0/150
提交
取消