如何更新/保存仅更改的字段

时间:2012-07-27 15:10:27

标签: playframework-2.0 ebean

如何使用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的表单,播放会重置我的用户对象并为此用户设置值0

那么,我如何才更新已更改的字段?

3 个答案:

答案 0 :(得分:4)

我没有直接回答您的问题,但是我没有使用布尔表示您的用户是管理员,而是创建一个继承自用户的Admin类。

public class Admin extends User {
....
}

这是S的“SOLID”; - )

修改

在控制器中,您可以在使用表单值进行更新之前从数据库加载旧值:

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

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

User.update(userFromForm);
...

答案 1 :(得分:2)

除了 nico的回答之外,我只能添加,在每种情况下都不需要使用Form类。有时仅仅从请求中获取数据并手动更新对象就足够了,当您具有详细的中间保存级别时,尤其是对于ajax调用非常有用(请参阅使用DynamicForm的示例,它可以更短,并且{{3 }}:

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

答案 2 :(得分:2)

您可以指定要更新的字段。假设您要更新名称,那么您将这样做:

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