작성
·
231
0
안녕하세요 영한님
@PostUpdate 이벤트 리스닝이 한 트랜잭션 내에서 반복 호출되는 이슈가 있어 질문 드립니다.
한 트랜잭션인 메서드 내에서
1. 상품 entity 조회
2. 가격 field 변경
3. 상품 entity 목록 조회
4. 상태 field 변경
위의 케이스에서
이렇게 2회 호출이 됩니다.
저는 트랜잭션이 종료되는 시점에 한번만 호출(동일한 엔티티가 한 메서드 내에서 여러번 수정되더라도) 되는 것을 생각하고 사용했다가 중복 작업이 발생되고 있는데요.
이 상황을 해결할 좋은 방법이 있을지 도움 요청드립니다.
답변 3
1
1
안녕하세요. 이길주님^^
먼저 FlushMode가 기본 Auto라는 것을 찾으셨으니 다음과 같이 처리할 수 있습니다.
1. 쿼리에 직접 플러시 모드 지정
em.createQuery("select m from Member m", Member.class)
.setFlushMode(FlushModeType.COMMIT)
.getResultList();
2. 엔티티 메니저에 플러시 모드를 COMMIT으로 변경하고, 쿼리 실행 후 복구
em.setFlushMode(FlushModeType.COMMIT);
em.createQuery("select m from Member m", Member.class)
.getResultList();
em.setFlushMode(FlushModeType.AUTO);
3. 스프링 데이터 JPA에서 적용
@Query("select m from Member m")
@QueryHints(value = { @QueryHint(name = org.hibernate.annotations.QueryHints.FLUSH_MODE, value = "COMMIT") })
List<Member> findMembers();
감사합니다.
0
FlushMode 가 기본 Auto 라 그렇게 동작하는 것은 알았습니다.
전역 기본 모드는 그대로 두고 method 단위로 FlushMode 를 commit 으로 두어 제가 의도한 대로 처리하는 방법이 있을까요?