Life Developer
인생 개발자
[JPA] 상속매핑(Inheritance) 전략 - JOINED*

이게 정석 전략임

 

장점 : 테이블 정규화, 외래키 참조 무결성 제약조건 활용 가능,저장공간 효율, 설계가 깔끔함

단점 : 조회시 조인을 많이함. 성능저하(조회쿼리 복잡), 저장시 insert 쿼리 2번 호출(생각보다 단점 아님)

 

싱글 테이블 상속 전략과는 약간 차이가 있다.

그냥 @Inheritance에 타입을 JOINED라고만 고치면 된다.

그럼 테이블이 각각 생성이된다.

뭐 이런식으로.

 

 

여기서 나는 DTYPE 의 이름을 TYPE_NAME으로 내맘대로 정해주었다.

그럼 컬럼명이 바뀐다.

JOINED 은 SINGLE_TABLE과는 달리 @DiscriminatorColumn 을 안써줘도 된다.

나는 굳이 써준거다.

빼면 이렇다.

 

 

굳이 타입을 정하지 않아도 뭐 개발하는 사람 입장에서는 무엇인지 유추가 가능하니까 안써도 된다.

시스템 운영할때는 사용하는것이 편하다.

 

JOINED는 테이블이 어떻게 생성될까.

create table Item (
       id bigint not null,
        name varchar(255),
        price integer not null,
        primary key (id)
    )

 

create table Movie (
       actor varchar(255),
        director varchar(255),
        id bigint not null,
        primary key (id)
    )

 

알아서 이렇게 생성해준다.

FK는? 이것도 뭐 자동이지 뭐.

alter table Movie 
       add constraint FK5sq6d5agrc34ithpdfs0umo9g 
       foreign key (id) 
       references Item

 

ㅋㅋ대박이네!

 

 

 

 

 

 

 

아래는 실습코드다.

 

 

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name="TYPE_NAME")
public class Item {
@Id
@GeneratedValue
private Long id;

private String name;
private int price;

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getPrice() {
return price;
}

public void setPrice(int price) {
this.price = price;
}
}

 

 

 

@Entity
@DiscriminatorValue("MV")
public class Movie extends Item{
private String director;
private String actor;

public String getDirector() {
return director;
}

public void setDirector(String director) {
this.director = director;
}

public String getActor() {
return actor;
}

public void setActor(String actor) {
this.actor = actor;
}
}

  Comments,     Trackbacks