개발자꿈나무

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

자바/JPA

실전 예제 - 상속관계 매핑

망재이 2023. 8. 21. 17:47

★ 요구사항 추가

- 상품의 종류는 음반, 도서, 영화가 있고 이후 더 확장될 수 있다.

- 모든 데이터는 등록일과 수정일이 필수이다.

 

 

★ UML

- 슈퍼타입 Item과 Album, Movie, Book의 서브타입이 존재한다. 이제 이 슈퍼타입 서브타입 모델을 어떤 전략으로 상속할지 정해야 한다. 갯수가 많지않고 각각의 컬럼 수도 많지 않으므로 단일 테이블 전략을 선택해서 만들어보겠다.

 

 

★ ERD

- DTYPE이라는 구분 컬럼을 추가해서 각각의 상품들을 구분하고 있다.

 

 

★ 상속 관계 매핑

- 상속 관계를 매핑할 때는 @Inheritance를 이용해서 전략을 적어주고 단일 테이블 전략은 구분 컬럼을 필수로 사용하여야 하므로, @DiscriminatorColumn을 추가해서 구분 컬럼만 추가해주면 끝이다.

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn
public abstract class Item extends BaseEntity {
    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    @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<>();
}
//앨범 엔티티
@Entity
public class Album extends Item{

    private String artist;
    private String etc;

}

//무비 엔티티
@Entity
public class Movie extends Item {

    private String director;
    private String actor;

}

//북 엔티티
@Entity
public class Book extends Item {

    private String author;
    private String isbn;

}

* 구분 컬럼명을 별도로 지정하고 싶으면 @DiscriminatorValue("")를 추가해주면 된다.

 

 

★ @MappedSuperclass 매핑

- 두 번째 요구사항을 만족하려면 모든 테이블에 등록일과 수정일 컬럼을 추가해야 하는데 중복도 되고 일일히 적는 것는 번거로우므로 @MappedSuperclass를 사용하는 것이 효과적이다.

@MappedSuperclass
public class BaseEntity {

    private Date createdDate;
    private Date lastModifiedDate;

}

- BaseEntity를 생성해서 어노테이션을 달아주고 등록일과 수정일 필드를 추가해주면 된다.

- 나머지 엔티티들은 BaseEntity를 상속하기만 하면 완성이다.

728x90

'자바 > JPA' 카테고리의 다른 글

지연 로딩과 즉시 로딩  (0) 2023.08.22
프록시  (0) 2023.08.22
복합 키 매핑  (0) 2023.08.20
@MappedSuperclass  (0) 2023.08.18
상속 관계 매핑  (0) 2023.08.18