인프런 커뮤니티 질문&답변

John님의 프로필 이미지
John

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

실전 예제 4 - 상속관계 매핑

부모와 자식 엔티티 간의 id 속성 상속에 대해 문의 드립니다.

작성

·

2.3K

·

수정됨

0

예제를 구현하다가 부모 엔티티와 자식 엔티티 간의 id 속성에 대해 궁금증이 생겨 문의 드립니다.

 

보통 엔티티 생성 시 @Id가 있는 필드를 정의하지 않으면 인텔리제이에서 경고문구를 띄워줍니다.

 

저도 @Entity 사용 시 @Id 컬럼 지정을 반드시 해야 한다고 배웠습니다.

 

그런데 상속관계 매핑 예제를 구현하다가

부모인 Item 엔티티 클래스와 자식인 Album 엔티티 클래스에서 ,

자식 Album 엔티티 클래스에 오히려 @Id를 지정하니 에러가 발생했습니다.

==> [ org.hibernate.mapping.JoinedSubclass cannot be cast to org.hibernate.mapping.RootClass ]

 

처음엔 extends를 했으니, @Id 필드가 자식에게 상속되는 건가?.. 싶었는데

private 속성은 상속되지 않잖아요?..

 

혹시 자식 엔티티에 @id를 설정하면 안돼는 이유를 알 수 있을까요??

 

[ 부모 Item entity class ]

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Item {

    public Item() {
    }

    @javax.persistence.Id @GeneratedValue
    @Column(name = "ITEM_ID")
    private Long Id;
    private String name;
    private int price;

 

[ 자식 Album entity class ]

@Entity
public class Album extends Item{

    public Album() {
    }
  /*  @javax.persistence.Id
    @GeneratedValue
    @Column(name = "ITEM_ID")
    private Long id;*/ // ---- 추가시 에러 발생

    private String director;
    private String actor;

답변 1

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. John님

@Id는 데이터베이스 테이블의 PK와 매핑하는 매핑 키 입니다.

그런데 상속 관계에서는 부모 엔티티에 있는 PK만 테이블과 매핑하면 나머지는 해당 매핑에 맞추어 처리됩니다. 따라서 자식 테이블에서 임의로 별도의 PK 전략을 가지고 가면 안됩니다.

감사합니다.

안녕하세요 궁금한게 있습니다
테이블이력을 남기려고
상속을 쓰면 좋겠다고 생각했습니다.
그리고 상속받은 테이블에 seq 필드 하나를 만들어서 @id를 주고 싶었습니다.

이런 경우는 불가능한거죠??

테이블 상속 관계가 아니니까.

이런 테이블 이력을 남기는 경우는 별도로 필드를 다 적어주어야하나요??

도움 부탁드립니다.

감사합니다.

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 지정수님

테이블 이력의 경우 상속관계를 사용하면 안되고, 별도의 테이블에 별도로 작업을 해야합니다.

감사합니다.

John님의 프로필 이미지
John

작성한 질문수

질문하기