Spring

속성을 지정하지 않고 SpringData JPA의 @Modifying에 대한 용도가 있습니까?

기록만이살길 2021. 3. 4. 03:04
반응형

속성을 지정하지 않고 SpringData JPA의 @Modifying에 대한 용도가 있습니까?

1. 질문(문제점):

AFAIK @Modifying@Query어노테이션에 지정된 INSERT / UPDATE / DELETE 쿼리의 경우 지속성 컨텍스트 정리를 처리합니다.
그러나 순수한 @Modifying유익은 무엇입니까? 이 포스트 에 따르면 , 당신은 항상 써야하는 것 같다 @Modifying(clearAutomatically=true, flushAutomatically=true).

문서에 따르면 ( 링크 ) :

EntityManager에는 수정 쿼리를 실행 한 후 오래된 엔터티가 포함될 수 있으므로 이를 자동으로 지우지 않습니다 . EntityManager에서 여전히 보류중인 모든 비 플러시 변경 사항을 효과적으로 삭제 하기 때문입니다 .

따라서 기본적으로 @Modifying청소하지 마십시오 (그리고 플러시하지 마십시오 ). 그렇다면 내 @Query방법에 추가해야하는 이유는 무엇입니까?

2. 해결방안:

@Modifying 어노테이션은 SELECT 쿼리뿐만 아니라 INSERT, UPDATE, DELETE 및 DDL 쿼리도 실행하도록 @Query 어노테이션을 향상시키는 데 사용됩니다.

이 어노테이션을 조금 가지고 놀면서 그 내용을 살펴 보겠습니다.

먼저 @Modifying UPDATE 쿼리의 예를 살펴 보겠습니다.

@Modifying
@Query("update User u set u.active = false where u.lastLoginDate < :date")
void deactivateUsersNotLoggedInSince(@Param("date") LocalDate date);

비활성화 된 사용자를 삭제할 또 다른 방법을 시도해 보겠습니다.

@Modifying
@Query("delete User u where u.active = false")
int deleteDeactivatedUsers();

보시다시피이 메서드는 정수를 반환합니다. 업데이트 된 엔터티의 수를 제공하는 SpringData JPA @Modifying 쿼리의 기능입니다.

@Query를 사용하여 삭제 쿼리를 실행하는 것은 SpringData JPA의 deleteBy 이름 파생 쿼리 메서드와 다르게 작동합니다. 후자는 먼저 데이터베이스에서 엔티티를 가져온 다음 하나씩 삭제합니다. 따라서 이는 해당 엔터티에서 수명주기 메서드 @PreRemove가 호출됨을 의미합니다. 그러나 전자의 경우 데이터베이스에 대해 단일 쿼리가 실행됩니다.

마지막으로 DDL 쿼리를 사용하여 삭제 된 열을 USERS 테이블에 추가해 보겠습니다.

@Modifying
@Query(value = "alter table USERS.USERS add column deleted int(1) not null default 0", nativeQuery = true)
void addDeletedColumn();

불행히도 수정 쿼리를 사용하면 기본 지속성 컨텍스트가 오래됩니다. 그러나이 상황을 관리 할 수 ​​있습니다.

65736766
반응형