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 |
댓글