jpa에서 entity끼리 관계를 맺으면서 cascade, fetch, orphanRemoval 등의 옵션들을 사용했는데 잘 모르고 썼었다. 보통 cascade는 all을 주고 fetch는 lazy를 사용하면 문제없이 작동했기 때문이다.
자세하게 탐구할 시간도 없이 마감에 쫓기던 중 관련한 오류가 터졌고 cascade를 공부하게 되었다.
error : detached entity passed to persist;
오역가능성이 다분하지만 cascade 상태가 detached 된게 persist에 들어왔다. 이런 말인것 같다.
평소에 CascadeType.ALL이 문제가 된 것이다.
구글링 결과 jpa는 entity를 save하면 cascadeType이 detach로 바뀐다고 한다. 이미 jpa의 관리에서 벗어난 entity를 다시 jpa를 통해 사용하려고 해서 생긴 문제인듯 하다.
해결하기 위해서는 관계 맺어진 곳에서 cascadeType 을 detached나 다른 옵션으로 바꿔주면 해결된다.
또는 저장하고 받은 return값을 다시 entity에 덮어쓰기 하면 다시 persistance가 관리해준다.
추후 할일...
1. hibernate나 jpa가 어떤 원리로 구동되는지 더욱 알아봐야 겠다.