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

Playframework 2.0 如何仅更新/保存已更改的字段,playframework-2.0,ebean,Playframework 2.0,Ebean,如何使用Play仅更新数据库中的一组特定字段?目前我有一个用户模型,它包含一个特定字段,我们称之为:isAdministrator: private boolean isAdministrator; 我有访问器方法: /** * @return the isAdministrator */ public boolean isAdministrator() { return isAdministrator; } /** * @param isAdministrator *

如何使用Play仅更新数据库中的一组特定字段?目前我有一个
用户
模型,它包含一个特定字段,我们称之为:
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


那么,我如何才能只更新更改的字段呢?

我没有直接回答您的问题,但是我会创建一个继承自用户的
admin
类,而不是使用一个布尔值来指示您的用户是否是管理员

public class Admin extends User {
....
}
它是;-)的“”号

编辑:

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

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

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

User.update(userFromForm);
...

除了尼科的答案之外,我只能补充一点,那就是你不需要在任何情况下都使用
Form
class。有时,只需从请求中获取数据并手动更新对象就足够了,这对于ajax调用尤其有用,尤其是当您有详细的中间保存级别时(参见使用示例,它可以更短,并且:


您可以指定要更新的字段。如果要更新名称,请执行以下操作:

Ebean.update(user, new HashSet<String>(Arrays.asList("name")));
Ebean.update(用户,新哈希集(Arrays.asList(“name”));

是的,我目前正在这样做:-),但我仍然有一个名为,
isArchived
的字段。所以仍然需要:-)
isArchived
字段处于
User
级别?为什么不把它添加到表单中呢?或者您也可以在使用表单值更新之前从db加载旧值(请参见我的编辑)。我不想将其添加到表单中,因为这是正在更改其配置文件的用户本人。将自己标记为存档是愚蠢的:-)。看起来解决方案是一个单独的POJO表单,但为什么Ebean要这样做?为什么不只更新已更改的字段?您不必将其添加到HTML表单中。我不明白:您说的是将其添加到for,而不是HTML中?您建议,只有解决方案看起来像是在保存之前从DB获取对象。也许您会在本讨论中找到一些结论:
Ebean.update(user, new HashSet<String>(Arrays.asList("name")));