2012-07-27 225 views
0

我剛創建一個設置頁面,用戶可以在其中更改他的用戶名。奇怪的是我正在使用相同的finder Method在主視圖和窗體中顯示它,但是這些對象彼此沒有關係。Model.find返回相同的對象參考

副作用現在,如果我不輸入用戶名,並點擊保存。兩個對象都被更新。以及視圖中顯示的錯誤。

我只是想在表單中使用一個單獨的模型。我在這裏做錯了什麼?我認爲調用「Model.find」每次都會返回一個對象的不同引用,即使它在db中是同一行。在這裏玩一些智能緩存嗎?

它在表單中改變用戶意味着更改視圖中所有其他相同的用戶對象。

行動渲染創建/編輯頁面:

public static void index(){ 
     User appUser = User.findUser(SecureSocial.getCurrentUser().id); 
     render(appUser); 
} 

我的看法(它顯示登錄的用戶名的電流)

${models.User.findUser(user.id).username} 

我的模型:

public static User findUser(UserId userId){ 
     User user = User.find("externalId = ? and provider = ?", userId.id, userId.provider.name()).first(); 
     return user; 
} 

感謝

回答

0

Hibernate支持你的永久存儲。對於一個事務中的一個持久(邏輯)對象,Hibernate將只會創建並保留它的一個實例,原因很多。所以你描述的行爲實際上是可以預料的。請參閱http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/objectstate.html#objectstate-overview

要讓對象的兩個實例同時出現,必須使用Hibernate的說法來分離(即,刪除指向DB對象的鏈接)。通常你分離被編輯的對象,並讓對象獨立進行渲染。

所以,你會改變你的控制器功能分離這是編輯的對象:

User.em().detach(user);