JPA
Entity 상속
혀눅짱
2023. 9. 13. 16:52
JPA Entity 상속 방법
@Inheritance(strategy=InheritanceType.XXX)의 stategy를 설정해주면 된다.
default 전략은 SINGLE_TABLE(단일 테이블 전략)이다.
InheritanceType 종류
JOINED
SINGLE_TABLE
TABLE_PER_CLASS
@DiscriminatorColumn(name="DTYPE")
부모 클래스에 선언한다. 하위 클래스를 구분하는 용도의 컬럼이다. 관례는 default = DTYPE
@DiscriminatorValue("XXX")
하위 클래스에 선언한다. 엔티티를 저장할 때 슈퍼타입의 구분 컬럼에 저장할 값을 지정한다.
어노테이션을 선언하지 않을 경우 기본값으로 클래스 이름이 들어간다.
Single table 전략
하나의 테이블에 하위 컬럼들을 전부포함하고 구분자로 구분함.
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "dtype")
@Getter @Setter
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<>();
@Entity
@Getter @Setter
@DiscriminatorValue("M")
public class Movie extends Item{
private String director;
private String actor;
}
@Entity
@Getter @Setter
@DiscriminatorValue("B")
public class Book extends Item{
private String author;
private String isbn;
}
@Entity
@Getter @Setter
@DiscriminatorValue("A")
public class Album extends Item{
private String artist;
private String etc;
}
Join 전략
부모엔티티의 식별자를 외래키로 각각 별도의 테이블을 생성함.
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Getter @Setter
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<>();
서브 엔티티가 각각 테이블로 생성됨.
Table per class 전략
슈퍼클래스의 컬럼들을 하위에 포함시키고 하위 클래스를 각각 테이블로 생성함.