해결된 질문
작성
·
639
3
@SpringBootApplication
public class JpashopApplication {
public static void main(String[] args) {
SpringApplication.run(JpashopApplication.class, args);
}
//@Bean
// Hibernate5Module hibernate5Module() {
// Hibernate5Module hibernate5Module = new Hibernate5Module();
// return hibernate5Module;
// }
}
hibernate5Module을 의존성 추가하지 않고
강제초기화를 해보았는데 오류가 나더라구요.
강제 초기화를 했고 sql문은 나갔을텐데 오류가 나는게 의아하더라구요.
@GetMapping("/api/v1/simple-orders")
public List<Order> ordersV1() {
List<Order> all = orderRepository.findAllByString(new OrderSearch());
for (Order order : all) {
order.getMember().getName();//강제 초기화
order.getDelivery().getAddress();
}
return all;
}
디버깅을 해보았는데
Member와 Delivery의 sql이 나가고
return에서 오류가 나더라구요.
order->프록시->영속성컨택스트로 이어지고
강제초기화를 해서 Member와 Delivery는 영속성 컨택스트에 담겼지만
return에서 Order의 Member와 Delivery에는 프록시값이 가리키는 영속성컨택스트가 아닌, 프록시까지만 json으로 변환하기때문에 오류가 난다고 생각하는게 맞는 걸까요?
그리고 그 프록시를 영속성컨택스트로 바꿔서 변환해주는게 hibernate5Module의 역할이라고 보면 될까요?
답변 1
5
안녕하세요. 김재준님
강제 초기화를 하더라도 해당 객체는 실제 객체가 아니라 프록시 객체 상태이기 때문입니다.
프록시 상태이고 내부에 실제 데이터가 초기화 되어 있는가 그렇지 않은가의 차이입니다. 해당 객체를 읽어서 출력해보면(.class()) 프록시 객체인 것을 확인할 수 있습니다.
hibernate5Module는 하이버네이트가 만든 프록시 객체를 JSON으로 읽을 수 있도록 도와주는 역할을 합니다.
감사합니다.