코드 그라데이션

실전 예제 - 4. 상속관계 매핑 본문

Spring/JPA 공부

실전 예제 - 4. 상속관계 매핑

완벽한 장면 2023. 8. 23. 16:13

요구사항 추가

• 상품의 종류는 음반, 도서, 영화가 있고 이후 더 확장될 수 있다.
• 모든 데이터는 등록일과 수정일이 필수다.

 

 

도메인 모델

상품에 상속 관계(3개) 추가

 

도메인 모델 상세

 

 

테이블 설계

 

 


고친 클래스

Item 추상 클래스로 바꾸고 전략 명시

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn
public abstract class Item { }

 

Album

@Entity
public class Album extends Item {

  private String artist;
  private String etc;

  public String getArtist() {
    return artist;
  }

  public void setArtist(String artist) {
    this.artist = artist;
  }

  public String getEtc() {
    return etc;
  }

  public void setEtc(String etc) {
    this.etc = etc;
  }
}

 

Movie

@Entity
public class Movie extends Item {

  private String director;
  private String actor;

  public String getDirector() {
    return director;
  }

  public void setDirector(String director) {
    this.director = director;
  }

  public String getActor() {
    return actor;
  }

  public void setActor(String actor) {
    this.actor = actor;
  }
}

 

Book

@Entity
public class Book extends Item {

  private String author;
  private String isbn;

  public String getAuthor() {
    return author;
  }

  public void setAuthor(String author) {
    this.author = author;
  }

  public String getIsbn() {
    return isbn;
  }

  public void setIsbn(String isbn) {
    this.isbn = isbn;
  }
}

 

실행하면

Hibernate: 
    
    create table Item (
       DTYPE varchar(31) not null,
        ITEM_ID bigint not null,
        name varchar(255),
        price integer not null,
        stockQuantity integer not null,
        actor varchar(255),
        director varchar(255),
        author varchar(255),
        isbn varchar(255),
        artist varchar(255),
        etc varchar(255),
        primary key (ITEM_ID)
    )

 

Item 클래스 엄청 커짐.

 

객체 넣으면

public class JpaShopMain {
  public static void main(String[] args) {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
    EntityManager em = emf.createEntityManager();

    EntityTransaction tx = em.getTransaction();
    tx.begin();

    try {
      Book book = new Book();
      book.setName("JPA");
      book.setAuthor("김영한");
      
      em.persist(book);

      tx.commit();
    } catch (Exception e) {
      tx.rollback();
    } finally {
      em.close();
    }
    emf.close();
  }
}

 

 

Hibernate: 
    /* insert inflearn.usejpashop.domain.Book
        */ insert 
        into
            Item
            (name, price, stockQuantity, author, isbn, DTYPE, ITEM_ID) 
        values
            (?, ?, ?, ?, ?, 'Book', ?)

 

아이템 테이블에 저장한 결과를 h2콘솔에서 확인하면

 

 

전략을 join으로 바꾼다면

@Inheritance(strategy = InheritanceType.JOINED)

 

실행하면

각각 생성됨을 확인할 수 있음

 

콘솔 가보면

 

다시 싱글테이블로 만들어놓고

 

BaseEntity 추가

BaseEntity

@MappedSuperclass // 매핑 정보만 받는 부모클래스
public abstract class BaseEntity {

  private String createdBy;
  private LocalDateTime createdDate;
  private String lastModifiedBy;
  private LocalDateTime lastModifiedDate;

  public String getCreatedBy() {
    return createdBy;
  }

  public void setCreatedBy(String createdBy) {
    this.createdBy = createdBy;
  }

  public LocalDateTime getCreatedDate() {
    return createdDate;
  }

  public void setCreatedDate(LocalDateTime createdDate) {
    this.createdDate = createdDate;
  }

  public String getLastModifiedBy() {
    return lastModifiedBy;
  }

  public void setLastModifiedBy(String lastModifiedBy) {
    this.lastModifiedBy = lastModifiedBy;
  }

  public LocalDateTime getLastModifiedDate() {
    return lastModifiedDate;
  }

  public void setLastModifiedDate(LocalDateTime lastModifiedDate) {
    this.lastModifiedDate = lastModifiedDate;
  }
}

  

나머지 클래스는 BaseEntity 상속

 

전략 및 후략

실행하면

Hibernate: 
    
    create table Category (
       id bigint not null,
        createdBy varchar(255),
        createdDate timestamp,
        lastModifiedBy varchar(255),
        lastModifiedDate timestamp,
        name varchar(255),
        PARENT_ID bigint,
        primary key (id)
    )

Hibernate: 
    
    create table CATEGORY_ITEM (
       CATEGORY_ID bigint not null,
        ITEM_ID bigint not null
    )

Hibernate: 
    
    create table Delivery (
       id bigint not null,
        createdBy varchar(255),
        createdDate timestamp,
        lastModifiedBy varchar(255),
        lastModifiedDate timestamp,
        city varchar(255),
        status integer,
        street varchar(255),
        zipcode varchar(255),
        primary key (id)
    )

Hibernate: 
    
    create table Item (
       DTYPE varchar(31) not null,
        ITEM_ID bigint not null,
        createdBy varchar(255),
        createdDate timestamp,
        lastModifiedBy varchar(255),
        lastModifiedDate timestamp,
        name varchar(255),
        price integer not null,
        stockQuantity integer not null,
        actor varchar(255),
        director varchar(255),
        author varchar(255),
        isbn varchar(255),
        artist varchar(255),
        etc varchar(255),
        primary key (ITEM_ID)
    )

Hibernate: 
    
    create table Member (
       MEMBER_ID bigint not null,
        createdBy varchar(255),
        createdDate timestamp,
        lastModifiedBy varchar(255),
        lastModifiedDate timestamp,
        city varchar(255),
        name varchar(255),
        street varchar(255),
        zipcode varchar(255),
        primary key (MEMBER_ID)
    )

Hibernate: 
    
    create table OrderItem (
       ORDER_ITEM_ID bigint not null,
        createdBy varchar(255),
        createdDate timestamp,
        lastModifiedBy varchar(255),
        lastModifiedDate timestamp,
        count integer not null,
        orderPrice integer not null,
        ITEM_ID bigint,
        ORDER_ID bigint,
        primary key (ORDER_ITEM_ID)
    )

Hibernate: 
    
    create table ORDERS (
       ORDER_ID bigint not null,
        createdBy varchar(255),
        createdDate timestamp,
        lastModifiedBy varchar(255),
        lastModifiedDate timestamp,
        orderDate timestamp,
        status varchar(255),
        DELIVERY_ID bigint,
        MEMBER_ID bigint,
        primary key (ORDER_ID)
    )

 

콘솔에 확인하면

컬럼 수가 엄청 늘어난 것을 확인 가능함.

 

728x90

'Spring > JPA 공부' 카테고리의 다른 글

지연 로딩  (0) 2023.08.24
프록시  (0) 2023.08.24
@MappedSuperclass  (0) 2023.08.23
상속관계 매핑  (0) 2023.08.23
실습 3 - 다양한 연관관계 매핑  (1) 2023.08.22
Comments