오늘 도메인 분석해서
entity 클래스를 구성하는 개발해보면서 배운거
개발중이 아니고 실무에서는 변경포인트를 열어주는 Setter를 열어 놓지 말자.
Spring JPA CascadeType 종류
javax.persistence.CascadeType
이 중에서
상위 엔터티에서 하위 엔터티로 모든 작업이 전파된다
출처: https://data-make.tistory.com/668 [Data Makes Our Future]
주문은 여러개의 주문상품을 가짐 > 하위엔터티는 OrderItems
@Entity
@Table(name = "orders")
@Getter @Setter
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", cascade = CascadeType.ALL)
private List<OrderItem> orderItems = new ArrayList<>();
}
OrderItem 엔터티
import javax.persistence.*;
@Entity
@Getter @Setter
public class OrderItem {
@Id @GeneratedValue
@Column(name = "order_item_id")
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "order_id")
private Order order;
private int orderPrice;
private int count;
}
위의 @ManyToOne 어노테이션에 속성
fetch = FetchType.LAZY 에 대해서도 배웠음
하이버 네이트 기존: 엔티티 필드명 그대로 테이블 컬럼명으로 사용
SpringPhysicalNamingStrategy
스프링부트 신규 설정 (필드 -> 컬럼)
@Entity
@Table(name = "orders")
@Getter @Setter
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", cascade = CascadeType.ALL)
private List<OrderItem> orderItems = new ArrayList<>();
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "delivery_id")
private Delivery delivery;
private LocalDateTime orderDate;
@Enumerated(EnumType.STRING)
private OrderStatus status; //order, cancel
//==연관관계 메서드==//
public void setMember(Member member) {
this.member = member;
member.getOrders().add(this);
}
public void addOrderItem(OrderItem orderItem) {
orderItems.add(orderItem);
orderItem.setOrder(this);
}
public void setDelivery(Delivery delivery) {
this.delivery = delivery;
delivery.setOrder(this);
}
//
}
라고 이해함