영속성 전이
참고
영속성 전이
- 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
- CascadeType.ALL
고아 객체
- 고아 객체란, 부모 엔티티와 연관 관계가 끊어진 자식 엔티티를 뜻한다.
- 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.