본문 바로가기
웹개발/JPA

영속성 전이 CASCADE

by 철없는민물장어 2023. 7. 19.
728x90
Cascade

특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속상태로 만들고싶을 때 사용한다.

(부모 엔티티 저장시 자식 엔티티도 함께 저장)

 

@Entity
class Parent{
	...
    @OneToMany(mappedBy="parent")
    private List<Child> childList;
    
    void addChild(Child child){
    	this.childList.add(child);
        child.parent=this;
    }
}

@Entity
class Child{
	@ManyToOne
	private Parent parent;
}

Parent, Child 클래스가 있다고 하자.

 

Child child1=new Child();
Child child2=new Child();
Parent parent=new Parent();

parent.addChild(child1);
parent.addChild(child2);

child 2개를 생성, parent 한개 생성하는 코드이다.

이를 영속하려면..

em.persist(child1);
em.persist(child2);
em.persist(parent);

이렇게 em.persist를 세번 호출해야한다.

 

부모만 저장하면 자식은 자동으로 저장되면 안될까?

Cascade 설정하면 된다.

@Entity
class Parent{
	...
    @OneToMany(mappedBy="parent", cascade=CascadeType.ALL)
    private List<Child> childList;
    
    void addChild(Child child){
    	this.childList.add(child);
        child.parent=this;
    }
}

부모에 cascade옵션을 설정해주면...

em.persist(parent); 한번으로 자식도 연쇄저장된다.

 

CASCADE는...

부모와 자식엔티티의 라이프사이클이 유사할때(등록과 삭제)

자식엔티티의 소유자가 부모 하나일 때 사용하는것이 좋다.(자식엔티티가 부모엔티티에 종속적일 때 사용하자) 

 

이 기능을 사용하면 부모가 제거될 때 자식도 함께 제거된다.


고아 객체

부모 엔티티와 연관관계가 끊어진 자식 엔티티를 고아 객체라고 한다.

이 고아 객체를 orpanRemoval=true로 설정하면 자동으로 삭제할 수 있다.

@Entity
class Parent{
	...
    @OneToMany(mappedBy="parent", orphanRemoval=true)
    private List<Child> childList;
    
    void addChild(Child child){
    	this.childList.add(child);
        child.parent=this;
    }
}

참조하는 곳이 하나일 때,

특정 엔티티가 개인소유할 때만 사용해야한다.

 

@OneToOne, @OneToMany에만 사용할 수 있다.

 

이 기능을 사용하면 부모가 제거될 때 자식도 함께 제거된다.

(부모가 삭제될 때 연관된 모든 자식이 부모 참조를 잃어버리므로..)

 


영속성 전이와 고아객체제거 기능을 함께 사용하면..

부모 객체를 통해 자식 객체의 생명 주기를 관리할 수 있게 된다.

 

728x90

'웹개발 > JPA' 카테고리의 다른 글

JPA가 지원하는 다양한 쿼리 방법  (0) 2023.07.22
값 타입  (0) 2023.07.19
즉시 로딩과 지연 로딩  (0) 2023.07.16
프록시  (0) 2023.07.14
@MappedSuperclass  (0) 2023.07.07

댓글