
특정 엔티티를 영속 상태로 만들 떄 연관되어 있는 엔티티도 함께 영속 상태로 만드는것이다.
만약 Parent 객체와 child 객체가 연관되어 있다고 가정하자.
@Entity
public class Parent {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "parent")
private List<Child> childList=new ArrayList<Child>();
}
@Entity
public class Child {
@Id
@GeneratedValue
private Long id;
private String name;
@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(child1);
em.persist(child2);
child객체의 갯수만큼 계속 persist하면 너무 귀찮다!
이때 사용하는 것이 cascade다.
@Entity
public class Parent {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "parent",cascade = CascadeType.ALL)
private List<Child> childList=new ArrayList<Child>();
}
child 코드는 동일하다.
Child child1 = new Child();
Child child2 = new Child();
Parent parent = new Parent();
parent.addChild(child1);
parent.addChild(child2);
em.persist(parent);
실행 결과:
Hibernate:
/* insert for
hellojpa.Parent */insert
into
Parent (name, id)
values
(?, ?)
Hibernate:
/* insert for
hellojpa.Child */insert
into
Child (name, parent_id, id)
values
(?, ?, ?)
Hibernate:
/* insert for
hellojpa.Child */insert
into
Child (name, parent_id, id)
values
(?, ?, ?)
Parent에 cascade = CascadeType.ALL을 설정해줌으로 Parent객체만 persist해도 자식객체가 전부 저장된다.
헷갈릴수도 있지만 영속성 전이(cascade)는 연관관계를 매핑하는 것과 아무 관련이 없다. 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함
을 제공할 뿐이다.
참조하는 곳이 하나일 때 사용해야한다.(자식 엔티티가 서로 다른 2개 이상의 부모 엔티티가 연관관계를 갖고있다면 조심해야 한다.)
참고로 CASCADE의 종류는 All, persist, remove, merge, refresh, detach가 있다.
고아 객체는 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 말한다.
참조가 제거된 엔티티는 다른 곳에서 참조하지 않는 고아 객체로 보고 삭제하는 기능
참고 자료 출처: 출처