it-swarm.com.de

warum müssen wir @Modifying Annotation für Abfragen in Data Jpa verwenden

ich habe zum Beispiel eine Methode in meiner CRUD-Schnittstelle, die einen Benutzer aus der Datenbank löscht:

public interface CrudUserRepository extends JpaRepository<User, Integer> {

    @Transactional
    @Modifying
    @Query("DELETE FROM User u WHERE u.id=:id")
    int delete(@Param("id") int id, @Param("userId") int userId);
}

Diese Methode funktioniert nur mit der Annotation @Modifying. Aber was ist hier für die Anmerkung nötig? Warum kann Spring die Abfrage nicht analysieren und verstehen, dass es sich um eine modifizierende Abfrage handelt?

27

Dadurch wird die der Methode mit Anmerkungen versehene Abfrage als Aktualisierungsabfrage anstelle einer Auswahlabfrage ausgelöst. Da der EntityManager nach der Ausführung der Änderungsabfrage möglicherweise veraltete Entitäten enthält, wird diese automatisch gelöscht (weitere Informationen finden Sie in JavaDoc von EntityManager.clear ()). Dadurch werden alle nicht gelöschten Änderungen, die noch im EntityManager anstehen, effektiv gelöscht. Wenn Sie nicht möchten, dass der EntityManager automatisch gelöscht wird, können Sie das clearAutomatically-Attribut von @Modifying annotation auf false setzen.

für weitere Details können Sie diesem Link folgen: -

http://docs.spring.io/spring-data/jpa/docs/1.3.4.RELEASE/reference/html/jpa.repositories.html

26
Anshul Sharma

Abfragen, für die eine @Modifying-Annotation erforderlich ist, umfassen die Anweisungen INSERT, UPDATE, DELETE und DDL.

Durch das Hinzufügen der @Modifying-Annotation wird angegeben, dass die Abfrage nicht für eine SELECT-Abfrage ist.

0

ACHTUNG!

Wenn Sie @Modifying(clearAutomatically=true) verwenden, werden alle ausstehenden Aktualisierungen der verwalteten Berechtigungen im Persistenzkontext gelöscht.

Wenn Sie dies tun, wird die mit Annotationen versehene Abfrage als Aktualisierungsabfrage und nicht als Auswahlabfrage ausgeführt. Da der EntityManager nach der Ausführung der Änderungsabfrage möglicherweise veraltete Entitäten enthält, wird diese nicht automatisch gelöscht (Details finden Sie im JavaDoc von EntityManager.clear ()), da hierdurch alle nicht gelöschten Änderungen gelöscht werden, die im EntityManager noch ausstehen. Wenn der EntityManager automatisch gelöscht werden soll, können Sie das clearAutomatically-Attribut der @Modifying-Annotation auf true setzen.

Zum Glück ab Spring Boot 2.0.4.RELEASE Spring Data fügte flushAutomatically flag ( https://jira.spring.io/browse/DATAJPA-806 ) hinzu, um verwaltete Entitäten im Persistenzkontext vor dem Ausführen der Änderung automatisch zu leeren Referenz zur Abfrageprüfung https://docs.spring.io/spring-data/jpa/docs/2.0.4.RELEASE/api/org/springframework/data/jpa/repository/Modifying.html#flushAutomatically =

So ist die sicherste Art, @Modifying ist:

@Modifying(clearAutomatically=true, flushAutomatically=true)

Übrigens, Spring Data docs hat seine Dokumente noch nicht damit aktualisiert.

0
Youans