728x90
영속성 전이: CASCAED
특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때
ex) 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장
cascade = CasecadeType.ALL
@Entity
public class Parent {
public List<Child> getChildList() {
return childList;
}
public void setChildList(List<Child> childList) {
this.childList = childList;
}
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
private List<Child> childList = new ArrayList<>();
}
@Entity
public class Child {
@Id
@GeneratedValue
private Long id;
@ManyToOne
@JoinColumn(name = "parent_id")
private Parent parent;
}
실습
Child child1 = new Child();
Child child2 = new Child();
Parent parent = new Parent();
parent.addChild(child1);
parent.addChild(child2);
em.persist(parent);
em.persist(parent)만 했는데 child도 같이 persist 됐다.
영속성 전이: CASCADE 주의
- 영속성 전이는 연관관계를 매핑하는 것과 아무 관련이 없다.
- 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화 하는 편리함을 제공할 뿐이다.
- 다른 엔티티와 영속성 전이된 엔티티가 매핑 관계가 있으면 영속성 전이를 사용하지 않는게 좋다
Member와 child가 매핑된 관계인데 child를 parent에 영속성 전이로 사용되면 관리가 힘들어진다.
CASCADE 종류
- ALL: 모두 적용
- PERSIST: 영속
- REMOVE: 삭제
- MERGE: 병합
- REFRESH: REFRESH
- DETACH: DETACH
고아 객체
orphanRemoval = true
- 고아객체 제거: 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Child> childList = new ArrayList<>();
위 예제에서 Parent 엔티티에서 List<Child>로 child를 관리하고 있는데 그 중 어떤 child가 list에서 제외되면 삭제해준다
list에서 remove해서 0번째 child 데이터를 지웠는데 delete 쿼리가 나간 걸 볼 수 있다.
고아 객체 주의
- 참조하는 곳이 하나일 때 사용해야한다.
- 특정 엔티티가 개인 소유할 때 사용
- CASCADE.REMOVE 처럼 동작한다.
영속성 전이와 연관관계 정리
CascadeType.ALL + orphanRemoval=true
스스로 생명주기를 관리하는 엔티티는 em.persist()로 영속화, em.remove()로 제거
위에 두 옵션을 활성화하면 부모 엔티티를 통해서 자식의 생명 주기를 관리할 수 있다.
도메인 주도 설계의 Aggregate Root개념을 구현할 때 유용하다.
728x90
'JPA' 카테고리의 다른 글
값 타입과 불변 객체와 값 타입 컬렉 (4) | 2023.11.10 |
---|---|
갑 타입 (1) | 2023.11.10 |
즉시 로딩과 지연 로딩 (2) | 2023.11.09 |
프록시 (1) | 2023.11.09 |
고급 매핑 (0) | 2023.11.09 |