개발자꿈나무
실전 예제 - 상속관계 매핑 본문
★ 요구사항 추가
- 상품의 종류는 음반, 도서, 영화가 있고 이후 더 확장될 수 있다.
- 모든 데이터는 등록일과 수정일이 필수이다.
★ 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 |