DOing
[JPA] 연속성 전이(CASCADE) 본문
➰ CASCADE (영속성 전이)
: 특정 엔티티를 영속상태로 만들 때 연관된 엔티티들도 영속상태들로 만들고 싶을때 사용한다.
: 주의해야 하는 것은 연관관계랑은 아무런 상관이 없다는 것이다.⭐⭐
: ALL(모두 적용) PERSIST(영속) REMOVE(삭제) 등이 있다. 이 세개만 주로 쓴다.
: PERSIST -> 하위 엔티티까지 영속성 전달한다.
-> 저장시 라이프사이클을 맞추고 싶을때 사용한다. 상위 엔터티 저장할때 하위 엔터티도 저장한다.
: REMOVE -> 같이 삭제하고 싶을때
: ALL -> 라이프사이클을 디 맞춰야 할때
@Entity
public class Parent{
@Id @GeneratedValue
private Long id;
@OneToMany(mappedBy="parent", casecade = CascadeType.ALL)
private List<Child> childList = new ArrayList();
...
}
사용
Parent parent = new Parent();
Child child1 = new Child();
Child child2= new Child();
parent.addChild(child1);
parent.addOrder(child2);
em.persist(parent);
Child child3 = new Child();
parent.addChild(child3);
// child1, child2, child3 insert 됨
Q. 언제 써야하는가?
-> 연관관계가 하나일 때(소유자가 하나일 때) + 라이프사이클이 거의 유사할 때
-> 반대로 여러 연관관계가 있다면 쓰지 않는게 좋다.
➰ 고아 객체 제거
: 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제한다.
: 연관관계가 끊어지면 DELETE쿼리가 나가게 된다.
Child child1 = new Child();
Child child2 = new Child();
Parent parent = new Parent();
parent.addChild(child1);
parent.addChild(child2);
// 부모만 저장하는데 자식도 같이 저장됨 = CASECADE.ALL 설정
em.persist(parent);
Parent findParent = em. find(Parent.class, parent.getId())
// 부모가 연관관계를 끊어버림 orphal remove 작동
findParent.getChildList().remove(0);
Entity
@Entity
public class Parent{
@Id @GeneratedValue
private Long id;
@OneToMany(mappedBy="parent", casecade = CascadeType.ALL, orphalRemoval = true)
private List<Child> childList = new ArrayList();
...
}
➰ 고아 객체 제거 - 주의사항
: 참조하는 곳이 하나일 때 사용해야한다.
: 특정엔터티가 개인소유할때 사용해야한다. 조심해서 사용해야한다.
: @OneToOne, @OneToMany만 가능하다.
: 부모를 제거하면 자식은 고아가 된다. 따라서 고아객체 제거기능을 활성화하면 부모를 제거할 때 자식도 같이 제거된다. 이것은 CascadeType.Remove처럼 동작한다.
출처
:
참고
: 블로그 글 (Persist를 함부로 사용하면 안되는 이유)
'JPA' 카테고리의 다른 글
[Querydsl] where 조건과 결과 조회 (0) | 2021.08.04 |
---|---|
Querydsl이란? (0) | 2021.08.04 |
[JPA] Fetch - 즉시 로딩, 지연 로딩 (0) | 2021.07.14 |
[JPA] 영속성 컨텍스트3 - 플러시 (0) | 2021.07.14 |
[JPA] 영속성 컨텍스트2 - 영속성 컨텍스트의 이점 (0) | 2021.07.14 |