[DB] detached entity passed to persist 에러
JPA 연결시키고 테스트 코드 돌려보다 여러 에러를 만나게 되었음.
그 중 마지막 에러.
이 에러의 원인은 종속성 관계에 있다고 함.
개인 과제의 예시를 들어보겠음.
문서와 사용자는 N:1 관계임.
문서 테이블의 인스턴스인 기안자(작성자)와 시행자는 사용자 id를 참조하고 있음.
이때 cascade를 통해 종속성 설정을 해두면
- 기안자(작성자) 저장할 때 사용자 id도 저장됨.
- 시행자 저장할 때 사용자 id 중복 저장됨.
⚠ 에러 발생!
사용자 id 에 해당하는 entity가 이미 등록된 키 값을 가지고 있기 때문.
✅ 해결
종속설 설정 해제하고 각각을 따로 저장하는 것.
필자의 경우, 기안자(작성자)와 시행자 entity에
@ManyToOne(cascade= CascadeType.PERSIST) 옵션을 주었는데 이걸 삭제했음.
❓왜 이런 에러가 났을까?
new 연산자를 이용해 entity를 객체화할 경우, 일시적이며 hibernate Session과 연관이 없음.
- (필자) Test 코드 작성하면서 new로 객체화하였음.
즉, DB에 지속적인 표현도 식별자 값도 없는 상태.
응용 프로그램이 해당 객체를 참조하지 않게 될 경우 '가비지 컬렉터'에 의해 파괴 됨.
따라서 hibernate Session을 사용해 해당 객체에 대한 지속성을 가지게 되는 것.
위의 예제를 들면,
기안자(작성자)를 저장하면 기안자와 사용자 id가 저장되고 Session에 기안자가 있음.
다음으로 시행자를 저장하고 사용자 id를 또 저장하려는데 이미 DB에 저장되어 있지만, Session에는 없어서 Detached Entity 에러가 발생하는 것.
이 앞전에는
영속성에 대한 에러가 발생해 cascade 넣어둔 거였는데,
결국 종속성의 문제로 다시 제거하게 되었음.
영속성과 종속성에 대한 공부가 많이 필요하다고 느낌...^^..