본문 바로가기
Tips/Errors

[JPA] @OneToMany 자식이 삭제되지 않는다

by 오늘의개발부 2022. 7. 18.
반응형
@Entity
public class Parents {

    @Id
    @Column(name="PARENTS_ID")
    private Long id;
	
    @OneToMany(mappedBy = "parents", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private List<Child> childList = new ArrayList<>();
    
}


@Entity
public class Child {

    @Id
    private Long id;
	
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "PARENTS_ID")
    private Parents parents;
    
}

 

 

간단하게 위와 같은 엔티티가 있다.

현재 부모를 삭제하는 코드를 작성하는 상황이다. 부모가 삭제되면 자식도 삭제되어야 하기에

 

for(Child child : parents.getChildList()){
	childRepository.delete(child);
}
parentsRepository.delete(parents);

 

이렇게 반복문을 돌며 자식을 모두 삭제한 후 부모를 삭제하려고 한다.

 

하지만 부모만 삭제될 뿐, 자식은 삭제되지 않는다. 이유가 뭘까?

 

양방향 관계가 맺어진 경우  부모객체에게서 삭제할 대상 객체가 삭제되어야한다. 

 

나는 for문을 모두 돌아 child를 삭제한 후 parents.getChildList().clear()를 해줄 생각이었으나, 자식 객체를 delete하기 전에 부모객체에게서 자식객체를 삭제해 관계를 끊어줄 필요가 있었다.

 

* 이 프로젝트에서는 중요한 데이터를 삭제할 때 기록을 남기기 위해 soft delete 정책을 사용한다. 하지만 단순한 데이터는 삭제되더라도 굳이 남겨둘 필요가 없어 delete를 하고 있다. 여기서 Parents는 soft delete를 활용하고 Child는 DELETE를 날리고 있었다. 하지만 위 문제는 이런 부분과 상관이 없는 듯하다.

* Parents가 soft delete를 사용하고 있다면 cascade는 작동하지 않는다. 즉 Parents를 삭제한다고 해서 Child가 함께 삭제되지 않는다. 위 코드와 같이 작성한 이유도 이 때문이었다.

* cascade 옵션을 사용하지 않으면 parents.getChildList().remove(child)를 먼저 해주지 않아도 child.delete가 동작한다. cascade 와 양방향 연관관계에 대해서는 조금 더 공부해야봐야겠다.

 

 

참고

이 포스팅에서 말하는 내용이 찾던 것과 다르다면 아래 링크를 확인해보길 권한다. 관련된 여러 상황에 대해 이야기 하고 있다.

https://stackoverflow.com/questions/22688402/delete-not-working-with-jparepository

 

Delete Not Working with JpaRepository

I have a spring 4 app where I'm trying to delete an instance of an entity from my database. I have the following entity: @Entity public class Token implements Serializable { @Id @

stackoverflow.com

 

반응형