웹 어플리케이션 개발

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 - 웹 애플리케이션 개발

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-%ED%99%9C%EC%9A%A9-1/dashboard