2009-09-16

LazyInitializationException 처리

나도 당해보니 고민이 되는구먼... 내가 이해하는게 맞는지 잘 모르겠단 말야... 이건 이런 경우가 아닐까 해.
XXX x = aaaService.getXXX();
bbbService.doSomething(x);

bbbService.doSomething(XXX x) {
    x.getYYY();  <-- 여기서 LazyInitializationException
}
즉 XXX x 객체가 세션의 바운더리를 넘어서 이동할 경우 Detached 상태가 된다는 것이 문제의 원인일 것 같아.

그러므로 해결책은 1) detached된 객체를 re-attach하거나 2) 위 두 서비스의 호출을 하나의 Unit of Work로 묶어주거나.

2번이 애플리케이션 설계 측면에서 더 매력적일 듯.

인터넷에 있는 해결책들은 대부분 lazy=false 를 사용하라 되어 있던데 이것도 좀 그래. 왜냐하면 난 대부분의 경우 lazy=true 기능을 쓰고 싶단 말이지. 그리고 lazy=false로 하지 않아도 쿼리시에 eager fetch를 하면 되니까.

이상은 모두 추측. ㅎ (문서를 상세히 읽지 않았음)

댓글 없음:

댓글 쓰기