Post

영속성 전이





참고



영속성 전이

  • Cascade
  • 특정 엔티티를 영속 상태로 만들 때, 연관 엔티티도 같이 영속 상태로 만드는 것
  • db의 cascade를 생각하면 된다.
  • 연관 관계 어노테이션의 속성으로 CascadeType을 줘서 설정할 수 있다.


1
2
3
4
5
6
class Bookshelf {
    // ...

    @OneToMany(mappedBy = "bookshelf", cascade = CascadeType.ALL)
    private List<Book> bookList;
}


  • 이렇게 설정할 수 있다.
  • CascadeType은 6가지가 있다.
    • CascadeType.ALL
      • 아래 모두 적용
    • CascadeType.PERSIST
    • CascadeType.REMOVE
    • CascadeType.MERGE
    • CascadeType.DETACH
    • CascadeType.REFRESH





고아 객체

  • 고아 객체란, 부모 엔티티와 연관 관계가 끊어진 자식 엔티티를 뜻한다.
    • bookshelf1에 꽂혀있던 book1과 book2가 있다고 할 때
    • bookshelf1이 삭제된 경우 book1과 book2를 고아 객체라고 한다.
  • 고아 객체 삭제
    • 부모 엔티티와 연관 관계가 끊어져 고아가 된 객체들을 삭제하는 것이다.
    • 연관 관계 어노테이션에서 orphanRemoval 속성을 true로 줘서 설정할 수 있다.


1
2
3
4
5
6
class Bookshelf {
    // ...

    @OneToMany(mappedBy = "bookshelf", orphanRemoval = true)
    private List<Book> bookList;
}


  • 이렇게 설정할 수 있다.

  • 주의점

    • @OneToOne과 @OneToMany의 경우에만 사용 가능하다.
    • 자식 객체를 참조하는 곳이 딱 한 곳일 때만 사용해야 한다.
      • 저자 author1이 쓴 책인 book1이 bookshelf1에 꽂혀있다고 할 때
      • bookshelf1은 orphanRemoval가 ture로 되어있다고 한다.
      • bookshelf1을 삭제했더니 book1도 삭제가 되었다.
      • 저자 author1은 책장을 없앴더니 본인이 쓴 책도 없어져버렸다.

Cascade와 orphanRemoval 두 속성을 모두 사용하여 부모 엔티티로 자식 엔티티의 생명 주기를 관리할 수 있다.





This post is licensed under CC BY 4.0 by the author.