인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

kmr345님의 프로필 이미지
kmr345

작성한 질문수

실전! 스프링 데이터 JPA

Lazy 강제 초기화를 해도 프록시 객체가 유지 됩니다.

작성

·

269

0

public List<Drawing> getDrawingList() {
List<Drawing> drawings = drawingService.findDrawings();
for (Drawing drawing : drawings) {
drawing.getDrawingCategory().getName();
}
return drawings;
}
위 코드 실행시에러 내용입니다.
 
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.ArrayList[0]->.drawing.entity.Drawing["drawingCategory"]->.drawingcategory.entity.DrawingCategory$HibernateProxy$dtz0HezH["hibernateLazyInitializer"])] with root cause
 
findDrawings 에서 JpaRepository가 findAll을 return 해줍니다.
 
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "category_id", nullable = false)
private DrawingCategory drawingCategory;
Drawing은 DrawingCategory를 ManyToOne으로 단방향 연관관계를 맺고 있습니다.
 
그래서,  drawing.getDrawingCateogory.getName 으로 Lazy 강제 초기화를 해주었는데 위의 에러가 나오네요..
 
fetch join을 사용하면 해결이 되긴 합니다만 get으로 Lazy연관관계의 값을 직접 가져와도 HibernateProxy객체가 유지되는지 궁금합니다.

답변 1

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. kmr345님

강제 초기화를 해주어도 프록시 객체이기 때문에 이런 오류가 발생할 수 있습니다.

활용2편을 공부해보시면 문제 해결방안을 찾으실 수 있을거에요^^

감사합니다.

kmr345님의 프로필 이미지
kmr345

작성한 질문수

질문하기