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 전략

 

슈퍼클래스의 컬럼들을 하위에 포함시키고 하위 클래스를 각각 테이블로 생성함.