Hibernate 를 사용하다가

HibernateException – A collection with cascade=”all-delete-orphan” was no longer referenced by the owning entity instance

의 오류를 발견했다. 인터넷을 뒤지다가 이에 대한 해결책을 찾아내었다.

본문을 보면 이런 내용이 나온다.

Your likely problem

Looks like you have a Parent entity and a Child entity. The Parent has a collection of Child entities with cascade=”all-delete-orphan”.

You are setting a new collection via the setter thus leaving the original collection unreferenced by the Parent entity. This doesn’t fly well with Hibernate and leaves it confused about what to do.

parent.setChilden(new HashSet<Child>()); // This won’t work. Could be an ArrayList too.

parent.getChildren().clear(); // There, fixed that!

So generally speaking, just clear out the old collection, rather than dereferencing it and creating a new one.

정리를 해보면, 필드에 새로 생성된 빈 Set 객체를 넣으려고 할 때 문제가 발생을 하는데,

초기화하려고 하는 Set 객체에서 clear() 메소드를 호출해주면 된다는 것이다. 

관계정의 옵션으로 

orphanRemoval=true, cascade=CascadeType.ALL

의 관계가 주어졌을 때 나타나는 증상으로 보인다.

  1. 컬렉션에 대한 초기화를 진행할 때,
    List<Object> children = new ArrayList<>();
    의 경우

    public void setChildren(List<Object> children) {
    this.children = children;
    // or

    으로 할 것이 아니라,
    public void setChildren(List<Object> children) {

    과 같은 형태로 적용하면 별 무리 없이 처리가 된다.
    주입을 통해서 컬렉션을 초기화하는 경우에 저 예외가 발생된다.

+ Recent posts