이 글은 “JPA 프로그래밍 입문 (최범균 저)” 책 내용을 정리한 글입니다.

만약 저작권 관련 문제가 있다면 “gunjuko92@gmail.com”로 메일을 보내주시면, 바로 삭제하도록 하겠습니다.

JPA 프로그래밍 입문 - 영속성 전이

1. 영속성 전이

영속성 전이는 엔티티의 영속성 상태 변화를 연관된 엔티티에도 함께 적용하는 것이다. 예를 들어, 엔티티를 저장할 때 연관된 엔티티도 함께 저장하고, 엔티티를 삭제할 때 연관된 엔티티도 함께 삭제하는 것이 영속성 전이이다.

  • 연관 매핑 설정에 cascade 속성을 사용해서 영속성 전이 방식을 지정한다.
  • cascade 속성에 올 수 있는 값은 아래와 같다.
    • PERSIST : EntityManager#persist() 실행시 연관된 엔티티를 함께 영속 객체로 추가한다.
    • REMOVE : EntityManager#remove() 실행시 연관된 엔티티를 함께 삭제한다.
    • DETACH : EntityManager#detach() 실행시 연관된 엔티티를 함께 분리 상태로 만든다.
    • REFRESH : EntityManager#refresh() 실행시 연관된 엔티티를 함께 다시 읽어온다.
    • MERGE : EntityManager#merge() 실행시 연관된 엔티티도 함께 관리 상태로 바꾼다.
    • ALL : 모든 상태 변화에 대해 연관된 엔티티에 함께 적용한다.
  • cascade 속성을 지정하지 않으면 기본값은 빈 배열이므로 모든 동작에 대해 영속성 상태 변화를 전이하지 않는다.
  • cascade 속성은 배열을 값으로 갖기 때문에 다음과 같이 필요한 전이 대상을 배열로 전달할 수 있다.
@OneToOne(cascade = {CascadeType.PERSIST, CascadeType.REFRESH})
@JoinColumn(name = "user_email")
private User user;
  • 영속성 전이는 모든 연관에 대해 적용할 수 있다.

2. 영속성 전이 주의 사항

  • CascadeType.REMOVE는 주의해라
    • 보통 엔티티를 삭제하면 연관된 엔티티를 삭제하기보다는 연관을 null로 할당하거나 콜렉션 연관에서 삭제하는 것이 더 일반적인 방법이다.
  • CascadeType.PERSIST는 보통 문제를 일으키지는 않는다.
    • 그렇다고 모든 연관의 cascade 속성에 PERSIST를 설정하는 것도 좋은 방법은 아니다.