OrderItems까지 같이 조회되는 이유가 궁금합니다!
668
53 câu hỏi đã được viết
안녕하세요
항상 좋은 답변 남겨주셔서 감사합니다
OrderItems까지 같이 조회되는 이유가 궁금해서 글을 적게 되었습니다.
@GetMapping("/api/v1/simple-orders")
public List<Order> ordersV1() {
List<Order> orders = orderService.findOrders(new OrderSearch());
orders.forEach(order ->
{
order.getMember().getName();
order.getDelivery().getStatus();
});
return orders;
}
V1 컨트롤러는 다음과 같습니다.
@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "orders")
public class Order {
@Id
@GeneratedValue
@Column(name = "order_id")
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
private Member member;
@OneToMany(mappedBy = "order", fetch = FetchType.LAZY, cascade = CascadeType.ALL) // order가 만들어지면 orderItem이 만들어지기 때문에 영속성 전이한다.
private List<OrderItem> orderItems = new ArrayList<>();
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private Delivery delivery;
private LocalDateTime orderDate;
@Enumerated(EnumType.STRING)
private OrderStatus status;
ORDER는 다음과 같습니다.
@Entity
@Getter
@Setter
public class OrderItem {
@Id
@GeneratedValue
@Column(name = "orderitem_id")
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "item_id")
private Item item;
@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "order_id")
private Order order;
private int orderPrice;
private int count;
ORDER_ITEM은 다음과 같습니다.
여기서 V1 컨트롤러를 통해서 쿼리를 날리면, 뒤늦게 Lazy Loading을 통해서 Order_Item들이 프록시 초기화가 되는 것처럼 나갑니다.
그런데 실제로는 프록시가 초기화도 되어있지 않습니다.
정리하면 이렇습니다
1. Order_Items는 Lazy Loading 설정이 되어있고, 프록시 객체를 강제 초기화 하는 과정도 없습니다. 그런데 왜 select 쿼리가 나가게 되는 것인지 알려주실 수 있으실까요?
2. orderItem에 대한 select 쿼리가 나갔음에도 불구하고 실제 응답에 있는 값은 null입니다. 이 경우는 어떻게 이해를 해야할까요?
항상 좋은 답변 주셔서 감사합니다!
Câu trả lời 2
1
시간이 지나 해결하셨을거 같은데 관련해서 답변이 있는거 같습니다 저도 이것보고 이해가 갔습니다.
0
안녕하세요. ...님
전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.
구글 드라이브 업로드 방법은 다음을 참고해주세요.
주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요
추가로 다음 내용도 코멘트 부탁드립니다.
1. 실행 방법을 알려주세요.
2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.
감사합니다.
0
안녕하세요!
답글 달아주셔서 너무 감사합니다.
자답 가능할 것 같습니다!
@OneToMany(mappedBy = "order", fetch = FetchType.LAZY, cascade = CascadeType.ALL) // order가 만들어지면 orderItem이 만들어지기 때문에 영속성 전이한다.
private List<OrderItem> orderItems = new ArrayList<>();
말씀하신 내용 하나하나 확인해보니 요 부분이 문제였던 것 같습니다
OrderItem이 Order에 영속성 전이가 되어서, Order가 select 될 때 OrderItems가 같이 Select 되게 된 것 같습니다.
감사합니다!
0
@안상혁 cascade 옵션 때문은 아닌 거 같습니다. 실제로 cascade 설정을 하지 않아도 동일하게 마지막에 orderItems 를 가져오는 쿼리를 날리는 것을 확인할 수 있습니다.
debugging 해보니까 응답을 만들기 위해 serialize 를 하는 과정에서 결국 쿼리가 날아가는 거 같던데, 왜 굳이 그런 동작이 이뤄지는지는 아직 잘 모르겠습니다.
0
저도 같은 내용때문에 고민중입니다ㅜㅜㅜorder 와 조인하는 member, delivery 는 proxy 객체로 넘어가는것을 볼수 있는데 orderItem 은 왜 lazy 강제 초기화 하는 것처럼 쿼리가 날라가는 건지 모르겠습니다. 어딜 이해못하고 있는건지..jpa어렵습니다...

return em.createQuery(
"select o from Order o " +
"join o.member m "
"join o.delivery d "
)
.getResultList();
강의 관련 외 질문입니다.
0
65
2
SpringBoot4 + Hibernate7 모듈 등록 방법 공유
0
86
1
BeanCreationException
0
86
3
Update 후 UpdateMemberResponse 매핑할 때
0
46
1
트랜잭션을 사용 안 할 때 커넥션은 언제 가져오나요?
0
98
2
페이징 + 검색조건 관련해서 질문드립니다.
0
70
1
Query Dsl Q파일 질문입니다.
0
81
1
루트 쿼리라는것은
0
58
1
메서드를 분리하는 기준
0
62
1
findAllWithMemberDelivery 메서드 질문드립니다.
0
108
3
연관관계 매핑을 안 쓸 경우, 사용해야 하는 전략
0
83
2
fetch join과 영속화와 OSIV의 관계
0
84
2
Distinct 사용 전 결과에 대한 의문
0
113
2
레포지토리 계층에서의 트랜잭션에 대한 의문
0
56
1
영속성 컨텍스트 생명주기의 신기한 부분이 있습니다.
0
78
2
dto 필드 속 엔티티 여부
0
58
1
뷰템플릿 사용 시
0
76
2
Result 클래스 관련 질문
0
56
1
@PostConstruct 프록시 관련 질문드립니다
0
85
1
DTO 대신 Form 사용은 안되나요?
0
133
1
OSIV ON 상태일 때
0
95
1
fetch join VS fetch join 페이징 궁금증
0
179
2
양방향 연관관계 알아보는 법?
0
104
1
16강 17강 간단 정리 이게 맞을까요 ?
0
165
2

