본문 바로가기
Dev/JPA

[JPA] 실습 - 상속관계 매핑

by dev_jsk 2021. 8. 25.
728x90
반응형

이전 실습에서 요구사항을 추가해보자

요구사항

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

테이블 및 엔티티 설계

테이블 설계 (좌측) / 엔티티 설계 (우측)

실습

테이블 설계 내용을 보면 단일 테이블 전략을 사용하여 구성한 것을 확인할 수 있다.

상품 종류 추가

- Item.java

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)  // 단일 테이블 전략
@DiscriminatorColumn(name = "DTYPE")  // 구분자 컬럼 지정
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<>();

    // getter, setter
}

- Album.java, Book.java, Movie.java

/** Album.java */
@Entity
public class Album extends Item {
    
    private String artist;
    private String etc;

    // getter, setter
}

/** Book.java */
@Entity
public class Book extends Item {
    
    private String author;
    private String isbn;

    // getter, setter
}

/** Movie.java */
@Entity
public class Movie extends Item {
    
    private String director;
    private String actor;

    // getter, setter
}

공통 정보 상속

- BaseEntity.java

@MappedSuperclass  // 매핑 정보 상속 클래스
public abstract class BaseEntity {
    
    private LocalDateTime createdDate;
    private LocalDateTime lastModifiedDate;

    // getter, setter
}

- Item.java

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DTYPE")
public abstract class Item extends BaseEntity {  // 매핑 정보 상속 받음
    
    @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<>();

    // getter, setter
}

Main

- JpaMain.java

public class JpaMain 
{
    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.setAuthor("김영한");
            book.setName("JPA");

            em.persist(book);

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

        emf.close();
    }
}

동작 결과

(1) Table DDL

구분자 컬럼(DTYPE)과 등록일, 수정일이 생성된다.

 

(2) Insert SQL 및 결과

단일 테이블 전략을 사용했기 때문에 ITEM 테이블에 모든 값을 저장하고 구분값에 'Book' 이 저장되는 것을 알 수 있다.

 

728x90
반응형

'Dev > JPA' 카테고리의 다른 글

[JPA] 실습 - 연관관계 관리  (0) 2021.08.27
[JPA] 프록시와 연관관계 관리  (0) 2021.08.27
[JPA] 고급 매핑  (0) 2021.08.24
[JPA] 실습 - 다양한 연관관계 매핑  (0) 2021.08.23
[JPA] 다양한 연관관계 매핑  (0) 2021.08.23

댓글