Te damos el resultado a este atasco, al menos eso pensamos. Si sigues con alguna interrogante puedes dejarlo en el apartado de preguntas, que con gusto te ayudaremos
Esto activará la consulta anotada en el método como consulta de actualización en lugar de una consulta de selección. Como EntityManager puede contener entidades obsoletas después de la ejecución de la consulta de modificación, lo borramos automáticamente (consulte JavaDoc de EntityManager.clear() para obtener más información). Esto eliminará efectivamente todos los cambios no vaciados que aún estén pendientes en el EntityManager. Si no desea que el EntityManager se borre automáticamente, puede configurar el borrado automático de la anotación @Modificando attribute a false;
Para obtener más detalles, puede seguir este enlace: –
http://docs.spring.io/spring-data/jpa/docs/1.3.4.RELEASE/reference/html/jpa.repositories.html
¡PRECAUCIÓN!
Utilizando @Modifying(clearAutomatically=true)
eliminará cualquier actualización pendiente en las entidades administradas en el contexto de persistencia, la primavera establece lo siguiente:
Al hacerlo, se desencadena la consulta anotada en el método como una consulta de actualización en lugar de una consulta de selección. Como el EntityManager puede contener entidades obsoletas después de la ejecución de la consulta de modificación, no lo borramos automáticamente (consulte el JavaDoc de EntityManager.clear() para obtener más detalles), ya que esto descarta todos los cambios no vaciados que aún están pendientes en el EntityManager. Si desea que el EntityManager se borre automáticamente, puede configurar el borrado automático de la anotación @Modificando attribute a true.
Afortunadamente, a partir de Spring Boot 2.0.4.RELEASE
Se agregaron datos de primavera flushAutomatically
flag (https://jira.spring.io/browse/DATAJPA-806) para vaciar automáticamente cualquier entidad administrada en el contexto de persistencia antes de ejecutando la referencia de verificación de consulta de modificación https://docs.spring.io/spring-data/jpa/docs/2.0.4.RELEASE/api/org/springframework/data/jpa/repository/Modifying.html#flushAutomatically
Así que la forma más segura de usar @Modifying
es :
@Modifying(clearAutomatically=true, flushAutomatically=true)
¿Qué pasa si no usamos esas dos banderas?
Considere el siguiente código:
repo
@Modifying
@Query("delete User u where u.active=0")
public void deleteInActiveUsers();
Escenario 1 por qué flushAutomatically
service
User johnUser = userRepo.findById(1); // store in first level cache
johnUser.setActive(false);
repo.save(johnUser);
repo.deleteInActiveUsers();// BAM it won't delete JOHN
// JOHN still exist since john with active being false was not
// flushed into the database when @Modifying kicks in
Escenario 2 por qué clearAutomatically
A continuación, considere johnUser.active es false ya
service
User johnUser = userRepo.findById(1); // store in first level cache
repo.deleteInActiveUsers(); // you think that john is deleted now
System.out.println(userRepo.findById(1).isPresent()) // TRUE!!!
System.out.println(userRepo.count()) // 1 !!!
// JOHN still exist since in this transaction persistence context
// John's object was not cleared upon @Modifying query execution,
// John's object will still be fetched from 1st level cache
// `clearAutomatically` takes care of doing the
// clear part on the objects being modified for current
// transaction persistence context
Entonces, si, en la misma transacción, está jugando con objetos modificados antes o después de la línea que hace @Modifying
, luego usa clearAutomatically
& flushAutomatically
si no, puede omitir el uso de estas banderas
Por cierto, esta es otra razón por la que siempre debes poner @Transactional
anotación en la capa de servicio, de modo que solo pueda tener un contexto de persistencia para todas sus entidades administradas en la misma transacción.
Consultas que requieren un @Modifying
anotación incluyen instrucciones INSERT, UPDATE, DELETE y DDL.
agregando @Modifying
la anotación indica que la consulta no es para una consulta SELECT.
Al final de todo puedes encontrar las interpretaciones de otros desarrolladores, tú además tienes la habilidad insertar el tuyo si dominas el tema.