Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

DOing

[JPA] 연속성 전이(CASCADE) 본문

JPA

[JPA] 연속성 전이(CASCADE)

mangdo 2021. 7. 15. 09:49

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를 함부로 사용하면 안되는 이유)