Como atualizar/salvar apenas campos alterados
-
12-12-2019 - |
Pergunta
Como posso atualizar apenas um determinado conjunto de campos no banco de dados com o Play?Atualmente tenho um User
modelo que contém um campo específico, vamos chamá-lo: isAdministrator
:
private boolean isAdministrator;
E eu tenho os métodos acessadores:
/**
* @return the isAdministrator
*/
public boolean isAdministrator() {
return isAdministrator;
}
/**
* @param isAdministrator
* the isAdministrator to set
*/
public void setAdministrator(boolean isAdministrator) {
this.isAdministrator = isAdministrator;
}
Mas quando mudo o nome de usuário, através de um formulário onde isAdministrator
NÃO está incluído, o Play redefine meus objetos de usuário e define o valor 0
para este usuário?
Então, como posso atualizar apenas os campos alterados?
Solução
Não respondo diretamente à sua pergunta, mas em vez de ter um booleano indicando que seu usuário é administrador ou não, eu criaria um Admin
classe que herda do usuário.
public class Admin extends User {
....
}
EDITAR:
No controlador, você pode carregar o valor antigo do banco de dados antes de atualizar com os valores do formulário:
...
User userFromDB = User.findById(anId);
User userFromForm = userForm.get();
// set previous value
userFromForm.setArchived(userFromDB.getArchived());
User.update(userFromForm);
...
Outras dicas
Além de Nico resposta só posso acrescentar que você não precisa usar Form
classe em todos os casos.Às vezes é suficiente apenas obter os dados da solicitação e atualizar seu objeto manualmente, o que é útil especialmente com chamadas ajax quando você tem um nível detalhado de salvamento intermediário (veja exemplo de uso do Formulário Dinâmico pode ser ainda mais curto e também você mesmo pode validar:
public static Result updateName(Integer id){
User user = User.find.byId(id);
user.name = form().bindFromRequest().get("name");
user.update(id);
return ok();
}
Você pode especificar os campos que deseja atualizar.Digamos que você queira atualizar o nome então você fará assim:
Ebean.update(user, new HashSet<String>(Arrays.asList("name")));