작성
·
284
0
Parent class
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "parent",cascade = CascadeType.ALL)
private List<Child> childList = new ArrayList<>();
public void addChild(Child... childArray) {
for (Child child : childArray) {
child.setParent(this);
childList.add(child);
}
}
Child class
@Setter
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "PARENT_ID")
private Parent parent;
Main 메서드
Parent parent = new Parent();
Child child = new Child();
Child child1 = new Child();
parent.addChild(child, child1);
em.persist(parent);
em.flush();
em.clear();
Parent findParent = em.find(Parent.class, parent.getId());
Child findChild = findParent.getChildList().get(0);
em.remove(findChild);
tx.commit();
Main메서드에서 findParent에서 자식 리스트를 가져와 첫번째 자식을 삭제해도 db에는 여전히 child, child1이 남아있는데 혹시 왜 그런지 알 수 있을까요?
안녕하세요 David님
orpahnRemoval 옵션은 부모와 관계가 끊겼을때 자식 엔티티가 삭제되는 옵션으로 알고있습니다. main메서드를 보시면 컬렉션에서 remove한것이 아닌 get을 통해 자식엔티티를 가져오고 있습니다.
cascadeType.ALL을 지우게되면 정상적으로 delet쿼리가 나가게되는데 ALL옵션만 주게되면 리스트에서 찾은 자식객체가 삭제되지 않네요..
orpahnRemoval옵션을 주었을시에는 마찬가지로 em.remove(컬렉션에서 가져온 자식엔티티)로 하면 삭제가 되지않고 childList.remove(0)으로해야 delete쿼리가 나가네요
질문을 올리고 생각해봤는데 부모 엔티티에 cascade옵션을 주는순간 cascade영향을 받는 자식 엔티티의 생명주기가 부모가 결정하는게 아닌지.. 그래서 삭제가 안되었던게 아닐까 생각합니다