@Enumurated : 기본 속성은 ORDINAL이다. ORDINAL은 1,2,3,4 숫자로 들어가기 때문에 새로운 속성이 들어갈때 순서가 밀릴 수 있으므로 꼭 STRING으로 넣어주자.
다대다 관계는 @JoinTable을 통해서 중간 테이블을 만들어 일대다, 다대일로 풀어내야한다.
Item.java
@ManyToMany
@JoinTable(name = "category_item",
joinColumns = @JoinColumn(name = "category_id"),
inverseJoinColumns = @JoinColumn(name = "item_id") //item쪽으로 들어가는 테이블 매핑)
private List<Category> categories = new ArrayList<>();
command + shift + F : Find in path
option + 엔터 : static import로 바꿔줌
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private List<OrderItem> orderItems = new ArrayList<>();
persist(orderItemA)
persist(orderItemB)
persist(orderItemC)
persist(order)
이렇게
엔티티당 각각 persist해주어야 하는데 cascade를 쓰면
persist(order) 한번만 해주어도 됨. 컬렉션 안에 있는 orderItem을 persist해줌.
양방향에서는 연관관계 메서드가 있는 것이 좋다.
연관관계 편의 메서드는 컨트롤하는 쪽이 들고있는것이 좋다.
Order.java
@Entity
@Table(name = "orders")
@Getter @Setter
public class Order {
@Id @GeneratedValue
@Column(name = "order_id")
private Long id;
@ManyToOne(fetch = LAZY)
@JoinColumn(name = "member_id")
private Member member;
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private List<OrderItem> orderItems = new ArrayList<>();
@OneToOne(fetch = LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "delivery_id")
private Delivery delivery;
//order_date로 바뀜
private LocalDateTime orderDate; //주문시간
@Enumerated(EnumType.STRING)
private OrderStatus status; //주문상태 [ORDER, CANCLE]
//==연관관계 메서드==//연관관계 세팅할때 편함.
/*
public static void main(Stirng[] args){
Member member = new Member();
Order order = new Order();
order.setMember(member);
}
이렇게 코드를 줄일 수 있음
*/
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);
}
}
Cateory.java
@Entity
@Getter
@Setter
public class Category {
@Id
@GeneratedValue
@Column(name = "category_id")
private Long id;
private String name;
@ManyToMany
@JoinTable(name = "category_item",
joinColumns = @JoinColumn(name = "category_id"),
inverseJoinColumns = @JoinColumn(name = "item_id")) //item쪽으로 들어가는 테이블 매핑)
private List<Item> items = new ArrayList<>();
@ManyToOne(fetch = LAZY)
@JoinColumn(name = "parent_id")
private Category parent;
@OneToMany(mappedBy = "parent")
private List<Category> child = new ArrayList<>();
//==연관관계 편의 메서드--//
public void addChildCategory(Category child) {
//부모 컬렉션에도 들어가야하고
this.child.add(child);
//자식도 부모가 누군지 알아야하므로 넣어준다.
child.setParent(this);
}
}