이게 정석 전략임
장점 : 테이블 정규화, 외래키 참조 무결성 제약조건 활용 가능,저장공간 효율, 설계가 깔끔함
단점 : 조회시 조인을 많이함. 성능저하(조회쿼리 복잡), 저장시 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;
}
}
'Developer' 카테고리의 다른 글
[JPA]@MappedSuperClass - 공통된 컬럼 관리 (0) | 2020.09.19 |
---|---|
[JPA] 상속매핑(Inheritance) 전략 - TABLE_PER_CLASS (0) | 2020.09.19 |
[JPA] 상속매핑(Inheritance) 전략 - SINGLE_TABLE (0) | 2020.09.19 |
[JPA]연관관계의 주인을 어떻게 정할까 (0) | 2020.09.18 |
[JPA]identity전략 특성 (0) | 2020.09.18 |