Verificamos de forma exhaustivamente cada artículos en nuestra web con el objetivo de mostrarte siempre información más veraz y actualizada.
Solución:
La identidad de las entidades se define por su principal keys. Ya que firstname
y lastname
no son partes de la primaria keyno puedes decirle a JPA que trate User
es con lo mismo firstname
arena lastname
s como iguales si tienen diferente userId
s.
Por lo tanto, si desea actualizar un User
identificado por su firstname
y lastname
necesitas encontrar eso User
por una consulta, y luego cambie los campos apropiados del objeto que encontró. Estos cambios se enviarán automáticamente a la base de datos al final de la transacción, por lo que no es necesario que haga nada para guardar estos cambios de forma explícita.
EDITAR:
Quizás debería dar más detalles sobre la semántica general de JPA. Existen dos enfoques principales para el diseño de las API de persistencia:
-
enfoque de inserción/actualización. Cuando necesite modificar la base de datos, debe llamar a los métodos de la API de persistencia explícitamente: llama
insert
para insertar un objeto, oupdate
para guardar el nuevo estado del objeto en la base de datos. -
Enfoque de unidad de trabajo. En este caso tienes un conjunto de objetos. administrado por biblioteca de persistencia. Todos los cambios que realice en estos objetos se descargarán en la base de datos automáticamente al final de la Unidad de trabajo (es decir, al final de la transacción actual en el caso típico). Cuando necesite insertar un nuevo registro en la base de datos, haga el objeto correspondiente administrado. Administrado Los objetos se identifican por su principal keysde modo que si crea un objeto con primario predefinido key administradose asociará con el registro de la base de datos del mismo id, y el estado de este objeto se propagará automáticamente a ese registro.
JPA sigue el último enfoque. save()
en Spring Data JPA está respaldado por merge()
en simple JPA, por lo tanto hace que su entidad administrado como se describió anteriormente. Significa que llamar save()
en un objeto con una identificación predefinida actualizará el registro de la base de datos correspondiente en lugar de insertar uno nuevo, y también explica por qué save()
no se llama create()
.
Dado que la respuesta de @axtavt se centra en JPA
no spring-data-jpa
Actualizar una entidad consultando y luego guardando no es eficiente porque requiere dos consultas y posiblemente la consulta puede ser bastante costosa ya que puede unirse a otras tablas y cargar cualquier colección que tenga fetchType=FetchType.EAGER
Spring-data-jpa
admite la operación de actualización.
Debe definir el método en la interfaz del Repositorio y anotarlo con @Query
y @Modifying
.
@Modifying
@Query("update User u set u.firstname = ?1, u.lastname = ?2 where u.id = ?3")
void setUserInfoById(String firstname, String lastname, Integer userId);
@Query
es para definir consultas personalizadas y @Modifying
es para decir spring-data-jpa
que esta consulta es una operación de actualización y requiere executeUpdate()
no executeQuery()
.
Puede especificar otros tipos de devolución:int
– el número de registros que se actualizan.boolean
– true si hay un registro que se está actualizando. De lo contrario, false.
Nota: Ejecute este código en una Transacción.
Simplemente puede usar esta función con la función save() JPA, pero el objeto enviado como parámetro debe contener una identificación existente en la base de datos; de lo contrario, no funcionará, porque save() cuando enviamos un objeto sin identificación, agrega directamente una fila en base de datos, pero si enviamos un objeto con una identificación existente, cambia las columnas que ya se encuentran en la base de datos.
public void updateUser(Userinfos u)
User userFromDb = userRepository.findById(u.getid());
// crush the variables of the object found
userFromDb.setFirstname("john");
userFromDb.setLastname("dew");
userFromDb.setAge(16);
userRepository.save(userFromDb);
valoraciones y comentarios
Puedes añadir valor a nuestra información contribuyendo tu veteranía en las críticas.