JPA 상속관계 매핑

장원재·2024년 4월 30일
0

jpa

목록 보기
5/11

객체 세상에서는 상속관계가 있다. 그리고 이와 유사하게 데이터베이스에서는 슈퍼타입과 서브 타입의 개념이 있다. jpa는 이러한 상황속에서 객체와 디비와 연결해주기 위해서 편리한 애노테이션을 제공한다. 바로 @Inheritance(strategy=InheritanceType.XXX) 이다. 해당 어노테이션을 부모에 해당하는 객체에 지정을 하고 원하는 전략을 선택해주면 된다.

  • 위 그림처럼 물품 이라는 공통적인 데이터를 가지는 슈퍼타입과 각 물품마다 가지는 고유한 필드를 서브타입인 상황을 가정하여 글을 작성하도록 하겠다.

1. Join 전략

처음 소개할 상속 전략은 Join이다. 코드는 다음과 같이 작성해주면 된다.

//Item.class
@Entity
@Inheritance(strategy = InheritanceType.JOINED) //요기
@DiscriminatorColumn()
public class Item {

    @Id @GeneratedValue
    @Column(name = "item_id")
    private Long id;

    private String name;
    private int price;
}

//Movie.class 
@Entity
public class Movie extends Item {
    private String director;
    private String actor;
}
  • 편의상 Item(부모 클래스) 와 Movie(자식 클래스) 2가지만 집중해보자.
  • @DiscriminatorColumn() 는 Dtype 이다.
  • @Inheritance(strategy = InheritanceType.JOINED) 을 통해 Join 전략을 활용할 수 있으며 결과는 아래 그림과 같은 테이블이 생성된다.

//main.class
Movie movie = new Movie();
movie.setActor("actor");
movie.setDirector("dir");
movie.setName("바람과 함께 사라지리라");
movie.setPrice(10000);
em.persist(movie);
  • 실행결과:

참고로 Dtype을 클래스 명이 아니라 다르게 지정하고 싶다면 자식 클래스에서 @DiscriminatorValue("무비") 로 수정해주면 된다.

2. Single

만약에 프로젝트의 규모가 크지 않다면 싱글 전략을 고려해볼 수 있다. 이는 하나의 테이블에 모든 값들을 넣는 것이라고 생각하면 된다. (아래 그림을 참고하자)

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) //요기 수정
@DiscriminatorColumn()
public class Item {
	...
}
  • main 실행 결과 모든 자식 필드가 item 테이블에 포함된것을 확인 가능하다
profile
데이터 분석에 관심있는 백앤드 개발자 지망생입니다

0개의 댓글

관련 채용 정보