웹 어플리케이션 개발
2023. 5. 10. 07:33ㆍ카테고리 없음
멤버 클래스
package jpabook.jpashop.domain;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import org.springframework.stereotype.Controller;
import java.util.ArrayList;
import java.util.List;
@Entity
@Getter @Setter
public class Member {
@Id @GeneratedValue //id 와 value 값 자동 생성.
@Column(name = "member_id") // MemberRepository의 save의 PK에 Key값이 됨.
private Long id;
private String name;
//@Embeddable 클래스에나 여기에나 둘중하나만 있어도 됨.
private Address addres;
@OneToMany(mappedBy = "member")
// order 테이블에 있는 멤버필드에 의해서 맵핑 된거야
// 반대로 일대다 관계
private List<Order> orders = new ArrayList<>();
}
주문 클래스
package jpabook.jpashop.domain;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import static jakarta.persistence.FetchType.*;
@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)
//cascade 코드의 사용으로 굳이 persist를 적지 않아도 알아서 persist가 된다.
private List<OrderItem> orderItems = new ArrayList<>();
@OneToOne(cascade = CascadeType.ALL, fetch = LAZY)
// 하나의 주문은 하나의 배송만 받아야함. 그리고 하나의 배송은 하나의 주문만 받아야함.
@JoinColumn(name = "delivery_id")
private Delivery delivery; //배송정보
//order_date 로 바뀜 카멜 케이스로 인하여.
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);
}
주문한 아이템 클래스
package jpabook.jpashop.domain;
import jakarta.persistence.*;
import jpabook.jpashop.domain.item.Item;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.cache.spi.support.AbstractReadWriteAccess;
import static jakarta.persistence.FetchType.LAZY;
@Entity
@Table(name = "order_item")
@Getter
@Setter
public class OrderItem {
@Id
@GeneratedValue
@Column(name = "order_item_id") //(FK)
private Long id;
@ManyToOne(fetch = LAZY)// 다대일
@JoinColumn(name = "item_id") //(FK) item을 참조할거니까 FK
private Item item; //주문 상품
@ManyToOne(fetch = LAZY) //다대일
@JoinColumn(name = "order_id")
// 하나의 Order가 여러개의 Orderitem을 가질 수 있지만, 반대로 아이템은 하나의 오더만 가능함.
private Order order; //주문
private int orderPrice; //주문 가격
private int count; //주문 수량
}
아이템에 들어갈 수있는 클래스들, 앨범, 책, 아이템, 영화 등
package jpabook.jpashop.domain.item;
import jakarta.persistence.DiscriminatorValue;
import jakarta.persistence.Entity;
import lombok.Getter;
import lombok.Setter;
@Entity
@DiscriminatorValue("A")
@Getter
@Setter
public class Album extends Item { // 아이템 상속
private String artist;
private String etc;
}
package jpabook.jpashop.domain.item;
import jakarta.persistence.DiscriminatorValue;
import jakarta.persistence.Entity;
import lombok.Getter;
import lombok.Setter;
@Entity
@DiscriminatorValue("B") // 테이블의 이름이 BOOK이면 B로 나오게끔 해주는..?
@Getter
@Setter
public class Book extends Item { // 아이템 상속
private String author;//저자(PK)
private String isbn;//책 번호(PK)
package jpabook.jpashop.domain.item;
import lombok.Getter;
import lombok.Setter;
import jpabook.jpashop.domain.Category;
import jakarta.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
// 정교화된 테이블 :Joined / SINGLE_TABLE : 한 테이블에 다 때려박는거 / TABLE_PER_CLASS : 3개의 테이블만 나오는 전략
@DiscriminatorColumn(name = "dtype") // 어떤 테이블의 이름을 지정해주는 것 같다.
@Getter @Setter
public abstract class Item {
// 구현체를 가지고 할 것이기 때문에 추상 클래스로.
@Id @GeneratedValue
@Column(name = "item_id")
private Long id; //(PK)
private String name;//(PK)
private int price;//(PK)
private int stockQuantity;//(PK)
@ManyToMany(mappedBy = "items")
//(FK) 다대다 환경에서 아이템도 카테고리를 리스트로 얻음.
private List<Category> categories = new ArrayList<Category>();
}
package jpabook.jpashop.domain.item;
import jakarta.persistence.DiscriminatorValue;
import jakarta.persistence.Entity;
import lombok.Getter;
import lombok.Setter;
@Entity
@DiscriminatorValue("M")
@Getter
@Setter
public class Movie extends Item { // 아이템 상속
private String director; // 감독(PK)
private String actor; // 배우(PK)
}
주문 상태를 보여주는 eunm
package jpabook.jpashop.domain;
public enum OrderStatus {
ORDER, CANCEL
}
출처 : 인프런 강의: 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발