(JPA) 엔티티 클래스 개발

JPA로 프로젝트를 해본적이 없어서 다음 수업을 들으면서 배운 내용을 정리하고 싶어요

더 배우거나 배우면서 더 많은 정보를 추가하는 대로 계속 업데이트하겠습니다.

도메인 모델 및 테이블 설계

아래 디자인에서 볼 수 있습니다.

1) 회원은 여러 상품을 주문할 수 있습니다.

2) 하나의 주문으로 여러 상품을 선택할 수 있습니다.

3) 제품은 공통 속성을 사용하기 때문에 상속 구조를 갖는다.

엔티티 개발

– 실제로 세터 주석은 피해야 합니다!

@Entity
@Getter@Setter
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<>();
}
@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")
    private List<OrderItem> orderItems = new ArrayList<>();
    
    @OneToOne(fetch = LAZY)
    @JoinColumn(name = "delivery_id")
    private Delivery delivery;
    
    private LocalDateTime orderDate;
    
    @Enumerated(EnumType.STRING)
    private OrderStatus orderStatus;
}
@Embeddable
@Getter
public class Address{

    private String city;
    private String street;
    private String zipcode;
}
@Entity
@Getter @Setter
public class Delivery{

    @Id @GeneratedValue
    @Column(name = "delivery_id")
    private Long id;
    
    @OneToOne(fetch = LAZY, mappedBy = "delivery")
    private Order order;
    
    @Embedded
    private Address address;
    
    @Enumerated(EnumType.STRING)
    private DeliveryStatus status;

}
@Entity
@Getter @Setter
public class OrderItem{

    @Id @GeneratedValue
    @Column(name = "order_item_id")
    private Long id;
    
    @ManyToOne(fetch = LAZY)
    @JoinColumn(name = "item_id")
    private Item item;
    
    @ManyToOne(fetch = LAZY)
    @JoinColumn(name = "order_id")
    private Order order;
    
    private int orderPrice;
    
    private int count;
}
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DisCriminatorColumn(name = "dtype")
@Getter @Setter
public abstract class Item{
	
    @Id @GeneratedValue
    @Column(name = "item_id")
    private Long id;
    
    private String name;
    
    private int price;
    
    private String stockQuantity;
    
    @ManyToMany
    private List<Category> categories = new ArrayList<>();
    

}
@Entity
@DiscriminatorValue("A")
@Getter @Setter
public class Album extends Item{

    private String artist;
    private String etc;
}
@Entity
@DiscriminatorValue("B")
@Getter @Setter
public class Book extends Item{
	
    private String author;
    private String isbn;
}
@Entity
@DiscriminatorValue("M")
@Getter @Setter
public class Movie{
	
    private String director;
    private String actor;
	
}
@Entity
@Getter @Setter
public class Category{
    @Id @GeneratedValue
    @Column(name = "category_id")
    private Long id;
    
    private String name;
    
    @ManyToMany(fetch = LAZY)
    @JoinTable(name = "category_item",
    	joinColumns = @JoinColumn(name = "category_id"),
        inverseJoinColumns = @JoinColumn(name = "item_id")
    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<>();
}