상속 관계 매핑
- 요구사항 추가
- 상품의 종류는 음반, 도서, 영화가 있고 이후 더 확장할 수 있음
- 모든 데이터는 등록일과 수정일이 있어야 함
- ERD 분석
- 엔티티를 상속 관계로 만들고 공통 속성은 Item 엔티티에 둔 후, Album, Book, Movie 자식 엔티티를 추가
- 상속 관계를 테이블 하나에 통합하는 단일 테이블 전략을 선택했으므로
ITEM 테이블 하나만 사용하고 DTYPE이라는 컬럼으로 자식 상품을 구분
- 상속 관계 매핑
- item이라는 패키지를 만들어서 상품(Item)과 상품의 자식 클래스(Album, Book, Movie)들을 모아둔 후,
상품 클래스는 직접 사용하지 않으므로 abstract를 추가해서 추상 클래스를 만듦
- item이라는 패키지를 만들어서 상품(Item)과 상품의 자식 클래스(Album, Book, Movie)들을 모아둔 후,
// 부모 엔티티 상품 (Item)
package jpabook.model.entity.item;
@Entity
// 상속 관계를 매핑하기 위해 @Inheritance 어노테이션을 사용한 후, 단일 테이블 전략 선택
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
// 단일 테이블 전략은 구분 컬럼을 필수로 사용해야 하므로 @DiscriminatorColum을 사용한 후
// 구분 컬럼 이름으로 DTYPE를 정해줌
@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<Category>();
// Getter, Setter
...
}
// 자식 엔티티 매핑
// Album.java
package jpabook.model.entity.item;
@Entity
// @DiscriminatorValue 어노테이션을 사용해 구분 컬럼(DTYPE)에 입력될 값을 정함
// A
@DiscriminatorValue("A")
public class Album extends Item {
private String artist;
private String etc;
...
}
// Book.java
package jpabook.model.entity.item;
@Entity
// @DiscriminatorValue 어노테이션을 사용해 구분 컬럼(DTYPE)에 입력될 값을 정함
// B
@DiscriminatorValue("B")
public class Book extends Item {
private String author;
private String isbn;
...
}
// Movie.java
package jpabook.model.entity.item;
@Entity
// @DiscriminatorValue 어노테이션을 사용해 구분 컬럼(DTYPE)에 입력될 값을 정함
// M
@DiscriminatorValue("M")
public class Movie extends Item {
private String director;
private String actor;
...
}
@MappedSuperclass 매핑
- 모든 테이블에 등록일과 수정일 컬럼을 직접 추가하는 것보다 @MappedSuperclass를 사용해 부모 클래스를 만들어 상속
// 기본 부모 엔티티 (BaseEntity)
package jpabook.model.entity;
@MappedSuperclass
public class BaseEntity {
private Date createdDate; // 등록일
private Date lastModifiedDate; // 수정일
// Getter, Setter
...
}
// 매핑 정보를 상속
// 회원
@Entity
public class Member extends BaseEntity { ... }
// 주문
@Entity
@Table(name = "ORDERS")
public class Order extends BaseEntity { ... }
// 자동 생성된 DDL
// 상속받은 매핑 정보가 추가되어 있는 것을 확인 가능
create table Member (
MEMBER_ID bigint not null,
createdDate timestamp,
lastModifiedDate timestamp,
city varchar(255),
name varchar(255),
street varchar(255),
zipcode varchar(255),
primary key (MEMBER_ID)
)
'Java-Spring > 자바 ORM 표준 JPA 프로그래밍' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍] 프록시와 연관관계 관리 - 실전 예제 (0) | 2022.04.15 |
---|---|
[자바 ORM 표준 JPA 프로그래밍] 프록시와 연관관계 관리 (0) | 2022.04.14 |
[자바 ORM 표준 JPA 프로그래밍] 고급 매핑 (0) | 2022.04.12 |
[자바 ORM 표준 JPA 프로그래밍] 다양한 연관관계 매핑 - 실전 예제 (0) | 2022.04.04 |
[자바 ORM 표준 JPA 프로그래밍] 다양한 연관관계 매핑 (0) | 2022.04.04 |