티스토리 뷰

JPA

상속관계 JPA로 구현하기

siyoon210 2018. 12. 5. 17:38
반응형

부모클래스(Entity) 설정

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "dtype")
public abstract class Parent {
    . . . 
}

부모 Entity클래스 애노테이션 2가지를 추가합니다.

  • @Inheritance(strategy = InheritanceType.JOINED) : 상속 관계를 맺고 있음을 명시해줍니다. 상속관계에 대한 설정은 JOINED전략, SINGLE_TABLE 전략, TABLE_PER_CLASS 전략 3가지가 있습니다. 각 전략마다 장단점이 있고 설정방법이 상이합니다. 여기서는 주로 쓰인다고 하는 조인전략으로 설명하도록 하겠습니다. 조인 전략을 사용하게 되면, 부모와 자식의 엔티티 모두가 별개의 테이블로 생성되고, 자식 테이블의 id는 부모의 id와 동일하며 이 id가 PK이자 FK역할을 동시에 수행합니다.
  • @DiscriminatorColumn(name = "dtype") : JOINED 전략을 사용하게 되면 부모와 자식들 각각의 엔티티가 모두 테이블로 만들어 집니다. 그러므로 테이블간의 관계를 표시하는 FK와 같은 역할을 하는 컬럼이 필요하여 자동으로 생성됩니다. 이때 생성되는 컬럼명은 name에 명시한 이름("dtype")으로 생성됩니다. 컬럼 내용에는 자식클래스의 @DiscriminatorValue 애노테이션으로 설정한 이름이 들어가게 됩니다.

자식클래스(Entity) 설정

@Entity
@DiscriminatorValue("a")
public class ChildA extends Parent{
    . . .
}
@Entity
@DiscriminatorValue("b")
public class ChildB extends Parent{
    . . .
}


주의사항

  • 자식클래스(Entity)에는 별도의 ID를 표시하지 않습니다. 부모클래스(Entity)에서 사용하는 ID를 PK이자, FK로 사용합니다. 
  • 자식클래스(Entity)에서 ID명은 부모의 컬럼명으로 그대로 쓰게 되지만, 별도의 컬럼명을 명시하고자 하면 @PrimaryKeyJoinColumn(name = "parent_id") 애노테이션을 이용합니다.



이 포스팅은 '자바 ORM표준 JPA 프로그래밍 (김영한 저자)'를 참고하여 작성하였습니다.

반응형
댓글