참고- 실전! 스프링 부트와 JPA 활용1- 웹 어플리케이션 개발
/**
* 주문
*/
@Transactional
public Long order(Long memberId, Long itemId, int count) {
//엔티티 조회
Member member = memberRepository.findOne(memberId);
Item item = itemRepository.findOen(itemId);
//배송정보 생성
Delivery delivery = new Delivery();
delivery.setAddress(member.getAddress());
//주문상품 생성
OrderItem orderItem = OrderItem.createOrderItem(item, item.getPrice(), count);
//주문 생성
Order order = Order.createOrder(member, delivery, orderItem);
//주문 저장
orderRepository.save(order);
return order.getId();
}
@OneToMany(mappedBy = "order", cascade = ALL)
private List<OrderItem> orderItems = new ArrayList<>();
Cascade= All
을 했기 때문이다.@OneToOne(fetch = LAZY, cascade = ALL)
@JoinColumn(name = "delivery_id")
private Delivery delivery;
orderRepository.save(order);
하나만으로 delivery와 orderItem까지 저장되는 것이다.누군가가 new로 orderItem을 만들어 사용할 수도 있다
-> 이렇게 여기 저기서 쓰는 방법이 달라지면 안되기 때문에 이를 막아주어야 한다.
protected OrderItem() {
}
@NoArgsConstructor(access = AccessLevel.PROTECTED)
-> 누군가 new 해서 만들면 빨간불이 뜨고 들어가보면 protected를 보면 '다른 방법으로 생성해야 하는구나' 하고 알 수 있도록.