반응형
이 글은 인프런의 김영한 강사님 자바 ORM 표준 JPA 프로그래밍-기본 편 강의 내용을 바탕으로 작성되었습니다.
일단 전체적인 ERD를 보자면 다음과 같다. 이걸 JPA 객체화 시켜보자
일단 맴버 앤티티를 보면 다음과 같다.
@Entity
public class Member {
@Id
@GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String name;
private String city;
private String street;
private String zipCode;
@OneToMany(mappedBy = "member")
private List<Order> orders = new ArrayList<>();
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getZipCode() {
return zipCode;
}
public void setZipCode(String zipCode) {
this.zipCode = zipCode;
}
}
여기서 한명의 맴버는 order엔티티와 양방향 관계를 맺어줬다. orders는 테이블 상에는 없는 컬럼이지만 양방향으로 맺어줬기 때문에 추가를 해줬다. 양방향 상태의 주인은 Order객체의 member 변수에 지정을 해줬다. 다음은 Order 객체이다.
@Entity
@Table(name = "ORDERS")
public class Order {
@Id
@GeneratedValue
@Column(name = "ORDER_ID")
private Long id;
@ManyToOne
@JoinColumn(name="MEMBER_ID")
private Member member;
@OneToOne
@JoinColumn(name = "DELIVERY_ID")
private Delivery delivery;
@OneToMany(mappedBy = "order")
private List<OrderItem> orderItems = new ArrayList<>();
private LocalDateTime orderDate;
@Enumerated(EnumType.STRING)
private OrderStatus status;
public void addOrderItem(OrderItem orderItem){
orderItems.add(orderItem);
orderItem.setOrder(this);
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Member getMember() {
return member;
}
public void setMember(Member member) {
this.member = member;
}
public LocalDateTime getOrderDate() {
return orderDate;
}
public void setOrderDate(LocalDateTime orderDate) {
this.orderDate = orderDate;
}
public OrderStatus getStatus() {
return status;
}
public void setStatus(OrderStatus status) {
this.status = status;
}
}
Order 객체는 Delivery 객체와 1:1 매핑이 되어있다. 때문에 delivery객체와 OneToOne으로 지정을 해줬다. OneToOne매핑은 OneToMany와 같게 주인을 지정을 해야된다. 연관관계 주인은 일대일 매핑에는 각가의 스타일마다 차이가 있으나, 여기서는 Order객체에 지정을 해줬다. 다음은 Delivery 객체이다.
@Entity
public class Delivery {
@Id
@GeneratedValue
private Long id;
private String city;
private String street;
private String zipCode;
private DeliveryStatus status;
@OneToOne(mappedBy = "delivery")
private Order order;
}
그리고 다음과 같이 양방향 관계에서 Order 객체에서 delivery에 지정한다고 (mappedBy="delivery")로 지정해 줬다.
@Entity
public class OrderItem {
@Id
@GeneratedValue
@Column(name = "ORDER_ITEM_ID")
private Long id;
@ManyToOne
@JoinColumn(name = "ORDER_ID")
private Order order;
@ManyToOne
@JoinColumn(name="ITEM_ID")
private Item item;
private int orderPrice;
private int cout;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
public Item getItem() {
return item;
}
public void setItem(Item item) {
this.item = item;
}
public int getOrderPrice() {
return orderPrice;
}
public void setOrderPrice(int orderPrice) {
this.orderPrice = orderPrice;
}
public int getCout() {
return cout;
}
public void setCout(int cout) {
this.cout = cout;
}
}
OrderItem은 특별한것은 없다. Order객체와 Item 객체와 다대일 매핑이 되어있다.
@Entity
public class Item {
@Id
@GeneratedValue
@Column(name = "ITEM_ID")
private Long id;
private String name;
private int price;
private int stockQuantity;
@ManyToMany(mappedBy = "items")
private List<Category> categories = new ArrayList<>();
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public int getStockQuantity() {
return stockQuantity;
}
public void setStockQuantity(int stockQuantity) {
this.stockQuantity = stockQuantity;
}
}
item 객체는 특이하게 Category객체와 다대다 로 매핑이 되어있다.
@Entity
public class Category {
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "PARENT_ID")
private Category parent;
@OneToMany(mappedBy = "parent")
private List<Category> child = new ArrayList<>();
@ManyToMany
@JoinTable(name = "CATEGORY_ITEM",
joinColumns = @JoinColumn(name = "GATEGORY_ID"),
inverseJoinColumns = @JoinColumn(name = "ITEM_ID"))
private List<Item> items = new ArrayList<>();
}
반응형
'spring > JPA' 카테고리의 다른 글
[JPA] 프록시와 연관관계 관리 (1) | 2023.12.11 |
---|---|
[JPA] 고급매핑 (0) | 2023.12.11 |
[JPA] 연관관계 매핑 기초 (2) | 2023.12.07 |
[JPA] 엔티티 매핑 (1) | 2023.11.09 |
[JPA] JPA 영속성 관리 (0) | 2023.11.07 |