1. 기본개념
@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);
}
}
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); //첫번째 자식 삭제
tx.commit();
[참고] 개념적으로 부모를 제거하면 자식은 고아가 됨 => CascadeType.REMOVE처럼 동작
@Entity
public class Parent {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "parent", orphanRemoval = true)
private List<Child> childList = new ArrayList<>();
//연관관계 편의 메소드
public void addChild(Child child) {
childList.add(child);
child.setParent(this);
}
}
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());
em.remove(findParent);
//부모를 삭제 => 모든 자식도 삭제
//cascade.ALL 옵션이 없더라도 컬렉션 자체가 없어지는 것이므로
tx.commit();
📌 참조하는 곳이 하나일 때만(특정 엔티티가 단독 소유) 사용!!!
3. 영속성 전이 + 고아 객체, 생명주기