Link Search Menu Expand Document

이슈

  • update를 하지 않았는데도 jpa에서 update 호출
  • 영속성 상태인 entity가 변경된다면 transaction이 종료될때 dirty checking 되며 변경점을 자동으로 저장
  • dirty checking 발생 하지만 entity는 변경점이 없음

원인

    @NotNull
    @Convert(converter = LimitedBidAttributeConverter.class)
    private BidLimit bidLimit;

    @Getter
    @AllArgsConstructor(staticName = "of")
    @NoArgsConstructor(access = AccessLevel.PROTECTED)
    public static class BidLimit {
        ...
    }
  • 중첩 클래스를 컨버터로 적용하여 사용하고 있었지만 equals/hashcode가 작성되어 있지 않기 때문에 다르다고 인식
  • transaction이 종료될때 dirty chacking 발생
  • dirty chacking(변경 감지 순서 자바 orm 표준 jpa 프로그래밍 114p) ** 트랜젝션을 커밋하면 엔티티 매니저 내부에서 먼저 플러시(flush())가 호출된다. ** 엔티티와 스냅샷을 비교해서 변경된 엔티티를 찾는다. (equals) ** 변경된 엔티티가 있으면 수정 쿼리를 생성해서 쓰기 지연 SQL 저장소에 보낸다. ** 쓰기 지연 저장소의 SQL을 데이터 베이스에 보낸다. ** 데이터베이스 트랜잭션을 커밋한다.

해결

  • 정상적으로 동작 하도록 중첩 클래스에 @EqualsAndHashCode 적용
  • 또는 강제로 변경점이 추적되지 않도록 @Column(updatable = false) 적용

참고

  • https://jojoldu.tistory.com/415