연관관계 예제
1) ERD설계
2) Entity 구조
3) 양방향 매핑 소스 예제
- Member.class(회원)
@Entity
@Getter
@Setter
@Table(name = "member")
public class Member {
@Id
@GeneratedValue
@Column(name = "member_id")
private Long id;
private String name;
@Embedded
private Address address;
@OneToMany(mappedBy = "member")
private List<Order> orders = new ArrayList<>();
}
- Order.class(주문)
@Entity
@Getter
@Setter
@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", cascade = CascadeType.ALL)
private List<OrderItem> orderItems = new ArrayList<>();
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "delivery_id")
private Delivery delivery; //배송정보
private LocalDateTime orderDate; //주문시간
@Enumerated(EnumType.STRING)
private OrderStatus status; //주문상태 [ORDER, CANCEL]
}
- OrderItem.class(주문정보)
@Entity
@Getter
@Setter
@Table(name = "order_item")
public class OrderItem {
@Id
@GeneratedValue
@Column(name = "order_item_id")
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "item_id")
private Item item; //주문 상품
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "order_id")
private Order order; //주문
private int orderPrice; //주문 가격
private int count; //주문 수량
}
- OrderStatus.enum(주문상태)
public enum OrderStatus {
ORDER, CANCEL
}
- Delivery.class(배달정보)
@Entity
@Getter
@Setter
@Table(name = "delivery")
public class Delivery {
@Id
@GeneratedValue
@Column(name = "delivery_id")
private Long id;
@OneToOne(mappedBy = "delivery", fetch = FetchType.LAZY)
private Order order;
@Embedded
private Address address;
@Enumerated(EnumType.STRING)
private DeliveryStatus status; //ENUM [READY(준비), COMP(배송)]
}
- DeliveryStatus.enum(배달상태)
public enum DeliveryStatus {
READY, COMP
}
- Address.class(주소정보)
@Embeddable
@Getter
public class Address {
private String city;
private String street;
private String zipcode;
protected Address() {
}
public Address(String city, String street, String zipcode) {
this.city = city;
this.street = street;
this.zipcode = zipcode;
}
}
- Item.class(제품)
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)//상속받은 자식테이블과 merge해서 item 테이블을 싱글테이블로만든다.
@DiscriminatorColumn(name = "dtype")//DiscriminatorValue -> item을 상속받은 자식들과 매핑
@Getter
@Setter
@Table(name = "item")
public abstract 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<>();
}
- Album.class(제품-Album)
@Entity
@DiscriminatorValue("A")
@Getter
@Setter
public class Album extends Item {
private String artist;
private String etc;
}
- Book.class(제품-Book)
@Entity
@DiscriminatorValue("B")
@Getter
@Setter
public class Book extends Item {
private String author;
private String isbn;
}
- Movie.class(제품-Movie)
@Entity
@DiscriminatorValue("M")
@Getter
@Setter
public class Movie extends Item {
private String director;
private String actor;
}
- Category.class(카테고리)
@Entity
@Getter
@Setter
@Table(name = "category")
public class Category {
@Id
@GeneratedValue
@Column(name = "category_id")
private Long id;
private String name;
@ManyToMany // 실무에서는 @ManyToMany 사용금지!!! @OneToMany, @ManyToOne 관계로 바꾸기!!!
@JoinTable(name = "category_item", //category 테이블과 item 테이블 사이의 중간테이블을 만든다.
joinColumns = @JoinColumn(name = "category_id"),
inverseJoinColumns = @JoinColumn(name = "item_id"))
private List<Item> items = new ArrayList<>();
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
private Category parent;
@OneToMany(mappedBy = "parent")
private List<Category> child = new ArrayList<>();
}
'웹 기술 쌈싸먹기 > JPA' 카테고리의 다른 글
[JPA] 벌크연산 (0) | 2022.02.09 |
---|---|
[JPA] Named 쿼리 (0) | 2022.02.09 |
[JPA] 다형성 쿼리 (0) | 2022.02.09 |
[JPA] 페치 조인(fetch join) (0) | 2022.02.09 |
[JPA] JPQL 경로표현식 (0) | 2022.02.09 |