Usando executeUpdate()
en la API Query
es más rápido, ya que no pasa por el contexto persistente .Sin embargo, pasando por alto el contexto persistente haría que el estado de la instancia en la memoria y los valores reales de ese registro en la base de datos no están sincronizados.
Consideremos el siguiente ejemplo:
Employee employee= (Employee)entityManager.find(Employee.class , 1);
entityManager
.createQuery("update Employee set name = \'xxxx\' where id=1")
.executeUpdate();
Después del lavado, el nombre en la base de datos se actualiza con el nuevo valor, pero el ejemplo empleado en la memoria aún conserva el valor original .Tienes llamar entityManager.refresh(employee)
para recargar el nombre actualizado del DB a la instancia del empleado. Suena extraño si los códigos todavía tienen que manipular la instancia del empleado después de la descarga, pero se olvida de actualizar() la instancia del empleado ya que la instancia del empleado todavía contiene los valores originales.
Normalmente, executeUpdate()
se utiliza en el proceso de actualización masiva, ya que es más rápido debido a pasar por el contexto persistente
La forma correcta para actualizar una entidad es que se acaba de establecer las propiedades que desea actualizar a través de los emisores y deje que el JPA genere la actualización de SQL durante el vaciado en lugar de escribirlo manualmente.
Employee employee= (Employee)entityManager.find(Employee.class ,1);
employee.setName("Updated Name");
@Ken Chan, 'entityManager.find (Employee.class, 1)' y 'employee.setName (" Nombre actualizado) 'causa dos consultas: seleccionar y actualizar. ¿Qué sucede si solo queremos una consulta cuando actualizando la entidad? ¿Es posible? – inherithandle
Odio la forma en que se realizan las actualizaciones en JPA. Puede causar muchas actualizaciones accidentales y efectos secundarios. A veces ni siquiera sabes que estás haciendo una actualización. – ceklock
¿Alguna manera de actualizar todas las propiedades con un nuevo objeto en lugar de hacerlo una por una? –