작성
·
310
0
@GetMapping("/api/v1/orders")
public List<Order> ordersV1() {
List<Order> all = orderRepository.findAll();
for (Order order : all) {
order.getMember().getName(); //Lazy 강제 초기화
order.getDelivery().getAddress(); //Lazy 강제 초기환
List<OrderItem> orderItems = order.getOrderItems();
orderItems.stream().forEach(o -> o.getItem().getName()); //Lazy 강제 초기화
}
return all;
}
첨부된 소스코드를 보면 "트랜잭션 안에서 지연 로딩 필요"라고 v1 메소드에 설명이 있습니다.
orderRepository.findAll( ); 의 호출이후 트랜잭션은 종료됐을 텐데 그 이후에 강제 Lazy로딩을 하는 것이 위 주석의 설명과 혼동이 됩니다.
기본편에서 진행을 할 때는 항상 tx.commit( ) 이전에 Lazy로딩을 했기 때문에 트랜잭션 안에서 지연로딩을 한다는 의미를 당연하게 받아드렸지만
웹MVC를 결합하면서 Controller쪽에서 findAll() 호출 후 진행되는 상황은 트랜잭션이 종료된 후이기 때문입니다.
답변부탁드립니다. 감사합니다.
답변 1
0
다음 강의 OSIV에서 해결됐습니다~!
[정리]
프레젠테이션 계층에도 계속 영속성 컨택스트가 남아있어 소유하고 있는 conn객체를 통해 조회(Lazy로딩)는 가능하나
서비스계층에서 트랜잭션이 종료됐기 때문에 프레젠테이션 계층의 엔티티 수정은 불가능하다
스스로 잘 해결하셨습니다^^