✅ cascade = CascadeType.ALL ✅ orphanRemoval = true
특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들도 싶을 때 사용
cascade = CascadeType.ALL
예: 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장
- 부모와 자식의 라이프 사이클 (저장, 삭제)가 동일할 때
- 단일 소유자 (부모가 하나)일 때만 사용
@Entity
public class Parent {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "parent")
private List<Child> childList = new ArrayList<>();
public void addChild(Child child){
childList.add(child);
child.setParent(this);
}
// getter
// setter
}
@Entity
public class Child {
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "parent_id")
private Parent parent;
// getter
// setter
}
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);
em.persist 를 총 3번 해줘야 함.
Parent 를 persis할 때 child도 자동으로 persis 하게 할 수는 없을까? 👇
@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);
}
// getter
// setter
}
Child child1 = new Child();
Child child2 = new Child();
Parent parent = new Parent();
parent.addChild(child1);
parent.addChild(child2);
em.persist(parent);
고아 객체 제거: 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제
orphanRemoval = true
- 참조하는 곳이 하나일 때 (영속성 정의와 동일)
- 특정 엔티티가 개인 소유할 때 사용 (영속성 정의와 동일)
- @OneToOne, @OneToMany만 가능
@Entity
public class Parent {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Child> childList = new ArrayList<>();
public void addChild(Child child){
childList.add(child);
child.setParent(this);
}
// getter
// setter
}
Child child1 = new Child();
Child child2 = new Child();
Parent parent = new Parent();
parent.addChild(child1);
parent.addChild(child2);
em.persist(parent);
em.flush();
em.clear();
Parent findParent = em.find(Parent.class, parent.getId());
findParent.getChildList().remove(0); // 부모 엔티티와 연관관계가 끊어졌으므로 0번 자식 엔티티를 자동으로 삭제한다.