인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

내가바로김민규님의 프로필 이미지
내가바로김민규

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

영속성 전이(CASCADE)와 고아 객체

왜 delete 쿼리가 안나가는 걸까요?

작성

·

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이 남아있는데 혹시 왜 그런지 알 수 있을까요?

 

 

답변 1

0

안녕하세요. 내가바로김민규님, 공식 서포터즈 David입니다.

orphanRemoval 옵션이 누락된 것으로 보입니다.

12분 37초부터 설명하고 있으니 참고해 주세요:)

감사합니다.

안녕하세요 David님

orpahnRemoval 옵션은 부모와 관계가 끊겼을때 자식 엔티티가 삭제되는 옵션으로 알고있습니다. main메서드를 보시면 컬렉션에서 remove한것이 아닌 get을 통해 자식엔티티를 가져오고 있습니다.

cascadeType.ALL을 지우게되면 정상적으로 delet쿼리가 나가게되는데 ALL옵션만 주게되면 리스트에서 찾은 자식객체가 삭제되지 않네요..
orpahnRemoval옵션을 주었을시에는 마찬가지로 em.remove(컬렉션에서 가져온 자식엔티티)로 하면 삭제가 되지않고 childList.remove(0)으로해야 delete쿼리가 나가네요

 

질문을 올리고 생각해봤는데 부모 엔티티에 cascade옵션을 주는순간 cascade영향을 받는 자식 엔티티의 생명주기가 부모가 결정하는게 아닌지.. 그래서 삭제가 안되었던게 아닐까 생각합니다

내가바로김민규님의 프로필 이미지
내가바로김민규

작성한 질문수

질문하기