Cómo actualizar/guardar solo los campos modificados
-
12-12-2019 - |
Pregunta
¿Cómo puedo actualizar solo un conjunto particular de campos en la base de datos con Play?Actualmente tengo un User
modelo que contiene un campo específico, llamémoslo: isAdministrator
:
private boolean isAdministrator;
Y tengo los métodos de acceso:
/**
* @return the isAdministrator
*/
public boolean isAdministrator() {
return isAdministrator;
}
/**
* @param isAdministrator
* the isAdministrator to set
*/
public void setAdministrator(boolean isAdministrator) {
this.isAdministrator = isAdministrator;
}
Pero cuando cambio el nombre de usuario, a través de un formulario donde isAdministrator
NO está incluido, Play restablece mis objetos de usuario y establece el valor 0
para este usuario?
Entonces, ¿cómo puedo actualizar sólo los campos modificados?
Solución
No respondo directamente a tu pregunta, pero en lugar de tener un valor booleano que indique si tu usuario es administrador o no, crearía un Admin
clase que hereda del Usuario.
public class Admin extends User {
....
}
EDITAR:
En el controlador, puede cargar el valor anterior de la base de datos antes de actualizar con los valores del formulario:
...
User userFromDB = User.findById(anId);
User userFromForm = userForm.get();
// set previous value
userFromForm.setArchived(userFromDB.getArchived());
User.update(userFromForm);
...
Otros consejos
Además de nico respuesta solo puedo agregar, que no necesitas usar Form
clase en todos los casos.A veces es suficiente simplemente obtener datos de la solicitud y actualizar su objeto manualmente, lo cual es útil especialmente con llamadas ajax cuando tiene un nivel detallado de guardado intermedio (vea el ejemplo de uso de Formulario dinámico puede ser incluso más corto y también puedes validarlo tu mismo:
public static Result updateName(Integer id){
User user = User.find.byId(id);
user.name = form().bindFromRequest().get("name");
user.update(id);
return ok();
}
Puede especificar los campos que desea actualizar.Diga que desea actualizar el nombre , entonces lo harás así:
Ebean.update(user, new HashSet<String>(Arrays.asList("name")));