2012-07-27 80 views
3

如何使用Play只更新一組特定的字段到數據庫?目前,我有一個User模型包含特定領域,讓調用它:isAdministrator如何僅更新/保存更改的字段

private boolean isAdministrator; 

和我有存取方法:

/** 
* @return the isAdministrator 
*/ 
public boolean isAdministrator() { 
    return isAdministrator; 
} 

/** 
* @param isAdministrator 
*   the isAdministrator to set 
*/ 
public void setAdministrator(boolean isAdministrator) { 
    this.isAdministrator = isAdministrator; 
} 

但是,當我更改用戶名,通過一種形式,不包括isAdministrator,Play將重置我的用戶對象併爲此用戶設置值0

那麼,我如何只更新更改的字段?

+0

也許你會發現在這個討論一些結論:https://開頭組.google.com/forum /#!msg/play-framework/jYNlO5vDn7A/tlm_uYe1FIoJ – biesior 2012-07-27 16:15:21

回答

4

我不直接回答你的問題,而是有一個布爾值,表示你的用戶是管理員或不是,我會創建一個Admin類繼承自用戶。

public class Admin extends User { 
.... 
} 

它的SOLID ;-)

S」 的編輯:

在控制器,你可以用表單值更新前從數據庫裝載舊值:

... 
User userFromDB = User.findById(anId); 
User userFromForm = userForm.get(); 

// set previous value 
userFromForm.setArchived(userFromDB.getArchived()); 

User.update(userFromForm); 
... 
+0

是的,我目前正在這樣做:-),但我仍然有一個名爲「isArchived」的字段。所以仍然需要這個:-) – adis 2012-07-27 15:16:39

+0

'isArchived'字段在'用戶'級別?爲什麼不把它添加到你的表單?或者,也可以在使用表單值更新之前從數據庫中加載舊值(請參閱我的編輯)。 – 2012-07-27 15:24:58

+0

我不想將它添加到表單中,因爲這是用戶自我,即正在更改他的個人資料。將自己標記爲存檔:-)將是愚蠢的。看起來解決方案是單獨的POJO表單,但爲什麼Ebean要這樣做?爲什麼不更新僅更改的字段? – adis 2012-07-27 15:28:59

2

除了nico's answe我只能補充說,你不需要在每種情況下都使用Form類。有時是不夠的,只是從請求手動獲取數據並更新你的對象,尤其是當你有詳細的中間儲蓄的水平(見例如使用DynamicForm的也可以是更短,也you can validate it yourself AJAX調用非常有用:

public static Result updateName(Integer id){ 
    User user = User.find.byId(id); 
    user.name = form().bindFromRequest().get("name"); 
    user.update(id); 
    return ok(); 
} 
+0

是的,你是絕對正確的! – 2012-07-27 17:13:35

2

您可以指定要更新的字段說你要更新的名稱那麼你會做這樣的:

Ebean.update(user, new HashSet<String>(Arrays.asList("name")));