2011-09-29 45 views
2

也許我誤解獲取和休眠合併的語義,但如果我這樣做(在Spring方法控制,所以使用的服務和DAO層):爲什麼使用session.get加載對象不會在會話結束時保留對象修改?

ClassMy a = service.get(234, ClassMy.class) (this loads the object using session.get) 

a.setPropertyX("test"); 

這不會導致自動更新。相反,如果我已經在內存中有「a」,我會這樣做:

a = (ClassMy) service.merge(a); 
a.setPropertyX("test"); 

這會導致更新。

是否必須在加載get後合併對象?聽起來很奇怪...

+0

愚蠢的我,唯一錯誤的是propertyX已經設置爲「測試」。在這種情況下,hibernate不會做任何事情。加載並提交後將其設置爲「test2」,將導致更新。 – gotch4

回答

2

你有什麼問題。

如果第一個代碼段與service.get調用在同一個事務中執行(即事務應該由包含此代碼段的方法啓動,而不是由service.get方法啓動),它應該可以工作。

在第二個片段中,如果它在事務中運行,那麼它應該工作:它從會話中加載實體,然後將分離的a的狀態複製到附加的實體,然後修改附加實體的屬性。如果它不在一個事務中運行(即,如果它是啓動事務的service.merge),則合併將會起作用,但屬性的更改將在分離的實體上完成,並且該屬性的新值將獲得不會被持續。

0

您必須確保交易在那裏。開始一個交易,調用「保存」,然後提交交易是強制性的。

+0

如果對象不是新的,保存不是必需的 – gotch4

+0

感謝您的支持! – prageeth

相關問題