4

如何使用 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 会重置我的 User 对象并0为该用户设置值?

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

4

3 回答 3

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);
...
于 2012-07-27T15:15:40.323 回答
2

除了尼科的回答我只能补充,你不需要Form在每种情况下都使用类。有时只需从请求中获取数据并手动更新您的对象就足够了,这在您有详细的中间保存级别时尤其适用于 ajax 调用(请参阅DynamicForm的使用示例,它可以更短,您也可以自己验证它

public static Result updateName(Integer id){
    User user = User.find.byId(id);
    user.name = form().bindFromRequest().get("name");
    user.update(id);
    return ok();
}
于 2012-07-27T16:30:09.877 回答
2

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

Ebean.update(user, new HashSet<String>(Arrays.asList("name")));
于 2014-04-29T07:13:25.943 回答