1. 기본개념
@Entity
public class Parent {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
private List<Child> childList = new ArrayList<>();
//연관관계 편의 메소드
public void addChild(Child child) {
childList.add(child);
child.setParent(this);
}
}
@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);
//각각 persist하지 않아도 parent cascade를 all로 설정하면 연관된 child도 영속상태가 됨
em.persist(parent);
// em.persist(child1);
// em.persist(child2);
tx.commit();
Hibernate:
/* insert hellojpa.cascade.Parent
*/ insert
into
Parent
(name, id)
values
(?, ?)
Hibernate:
/* insert hellojpa.cascade.Child
*/ insert
into
Child
(name, PARENT_ID, id)
values
(?, ?, ?)
Hibernate:
/* insert hellojpa.cascade.Child
*/ insert
into
Child
(name, PARENT_ID, id)
values
(?, ?, ?)
📌영속성 전이는 연관관계 맵핑과는 전혀 관련이 없음
- 엔티티를 영속화할 때 연관된 엔티티도 같이 영속화하는 편리함을 제공할 뿐
2. cascade의 종류
실무에서는 ALL, PERSIST 정도만 실제 많이 활용함
3. 주의점
📌소유자가 하나일 때, 단일 엔티티에 완전히 종속적일 때, 부모와 자식의 라이프사이클이 완전히 같을 때만 사용!!!
- Child가 다른 엔티티와도 관계가 있을 경우에는 사용 X