Home @MappedSuperclass
Post
Cancel

@MappedSuperclass

@MappedSupperclass

이전 포스팅에서 상속 관계 매핑에 대해서 알아보았다. 상속관계 매핑은 부모 클래스와 자식 클래스를 모두 데이터베이스 테이블과 매핑하였는데 부모 클래스는 테이블과 매핑하지 않고 부모 클래스를 상속받는 자식 클래스에게 매핑 정보만 제공할 때 사용하는 것이 @MappedSupperclass 이다.

사진

회원(Member)과 판매자(Seller)는 서로 연관이 없는 테이블이다. 하지만 둘은 id, name이라는 공통 속성을 가지고 있다. 그림과 같이 우리는 상속을 통해 이를 표현해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@MappedSupperclass
public abstract class BaseEntity {
    @Id @GeneratedValue
    private Long id;

    private String name;
}

@Entity
public class Member extends BaseEntity {
    private String email;
}

@Entity
public class Seller extends BaseEntity {
    private String shopName;
}

코드를 살펴보면 BaseEntity에 공통 속성인 idname을 정의하고 이를 상속 받도록 하였다.

여기서 중요한점은 BaseEntity는 단순히 공통 속성을 상속하는 목적으로 사용되었기 때문에 실제 테이블과 매핑할 필요가 없다는 점이다.

이때 사용하는 것이 @MappedSupperclass이고 JPA는 이 어노테이션이 붙은 클래스(부모 클래스)를 테이블과 매핑하지 않는다. 그리고 이 속성들은 상속받은 자식클래스의 테이블에서 매핑한다.

@AttributeOverride

만약 부모로 부터 상속받은 매핑 정보를 재정의 하고자 할때는 @AttributeOverride를 사용하면 된다.

1
2
3
4
5
@Entity
@AttributeOverride(name = "id", column = @Column(name = "member_id"))
public class Member extends BaseEntity {
    private String email;
}

부모에게 상속 받은 id 속성을 member_id로 재정의 하는 코드이다.

만약 둘 이상의 속성을 재정의 할때는 @AttributeOverrides를 사용하면 된다.

1
2
3
4
5
6
7
8
@Entity
@AttributeOverrides({
    @AttributeOverride(name = "id", column = @Column(name = "member_id")),
    @AttributeOverride(name = "name", column = @Column(name = "member_name"))
})
public class Member extends BaseEntity {
    private String email;
}

@MappedSupperclass의 특징

  • 테이블과 매핑되지 않고 자식 클래스에 엔티티의 매핑 정보를 상속하기 위해 사용
  • @MappedSupperclass로 지정한 클래스는 엔티티가 아니므로 em.find()나 JPQL에서 사용 불가
  • 이 클래스를 직접 생성하여 사용할 일은 거의 없으므로 추상 클래스로 만드는 것을 권장

참고

This post is licensed under CC BY 4.0 by the author.

상속관계 매핑

즉시로딩과 지연로딩 그리고 프록시

Comments powered by Disqus.