Saltar al contenido

¿Por qué tenemos que usar la anotación @Modifying para consultas en Data Jpa?

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é clearAutomaticallyA 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *