Как обновить/сохранить только измененные поля
-
12-12-2019 - |
Вопрос
Как я могу обновить только определенный набор полей в базе данных с помощью 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
для этого пользователя?
Итак, как мне обновить только измененные поля?
Решение
Я не отвечаю на ваш вопрос, но вместо того, чтобы быть логическим, указывающим, что ваш пользователь является администратором или нет, я бы создал класс 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
класс в любом случае.Иногда достаточно просто получить данные из запроса и обновить объект вручную, что полезно, особенно при вызовах ajax, когда у вас есть подробный уровень промежуточного сохранения (см. пример использования ДинамическаяФорма это может быть еще короче, а также ты можешь проверить это сам:
public static Result updateName(Integer id){
User user = User.find.byId(id);
user.name = form().bindFromRequest().get("name");
user.update(id);
return ok();
}
Вы можете указать поля, которые вы хотите обновить.Скажем, вы хотите обновить имя , то вам понравится следующее:
Ebean.update(user, new HashSet<String>(Arrays.asList("name")));
.