2009-05-06 79 views
3

我使用2.5並通過註釋做所有事情。Spring MVC @SessionAttributes混淆!

我有一個簡單的表單,允許用戶編輯一個對象。它後面的控制器創建該對象並將其添加到GET上的模型,並在POST(提交)上處理更改。它工作正常,但我不明白爲什麼。該對象永遠不會顯式添加到會話中,並且該對象的「id」不會傳遞給提交方法。控制器的提交方法如何知道對象的「id」值?

這個問題出現的原因是我有另一個表單/控制器幾乎與上面的相同,但是除非將對象添加到@SessionAttributes,否則不會「工作」。不同的是,這個特定的控制器工作的對象有一個引用另一個對象是懶加載(我在後臺使用Hibernate)。當我在未將父對象放入SessionAttributes的情況下提交表單時,我得到DataIntegrityViolationException,因爲我從不加載引用的對象。

當我將父對象添加到@SessionAttributes時,問題奇蹟般地消失。我神奇地說,因爲即使我將父對象放入GET的會話中,我仍然沒有顯式加載引用的對象,所以它應該爲空(或空代理或任何發生的事情)。

世界正在發生什麼?我需要一些幫助!

回答

1

控制器的提交方法如何知道對象的「id」值?

控制器不知道「id」。我認爲Spring使用默認構造函數創建新對象,並將表單數據填充到它中。 Hibernate必須認爲這是一個新對象,並用一個新的ID將它存儲到數據庫中。

2

該對象很可能在提交階段重新創建。該ID可能被「存儲」在隱藏的表單字段中。

你應該小心會話屬性,我總是試圖避免它,除非我有一個很好的理由。與Hibernate相結合,它可以製造各種頭痛。

如果您必須使用完全初始化的副本。