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

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