(2) @MappedSuperclass
지금까지 상속 관계 매핑은 부모 클래스와 자식 클래스를 모두 데이터베이스 테이블과 매핑했다.
부모 클래스는 테이블과 매핑하지 않고 부모 클래스를 상속받는 자식 클래스에게 매핑 정보만 제공하고 싶으면 @MappedSuperclass
를 사용하면 된다.
즉, 부모 클래스와 자식 클래스는 어떠한 연관관계도 없고, 단지 자식 클래스들의 공통적인 속성만 따로 뽑아내서 만들어내는 클래스이다. (엔티티가 아님!)
회원과 판매자는 서로 관계가 없는 테이블과 엔티티이다. 테이블은 그대로 두고 객체 모델의 id
, name
두 공통 속성을 부모 클래스로 모으고 객체 상속 관계로 만든다.
@MappedSuperclasspublic abstract class BaseEntity {@Id @GeneratedValueprivate Long id;private String name;...}@Entitypublic class Member extends BaseEntity {// ID 상속// NAME 상속private String email;...}@Entitypublic class Seller extends BaseEntity {// ID 상속// NAME 상속private String shopName;...}
BaseEntity
에는 객체들이 주로 사용하는 공통 매핑 정보를 정의했다. 그리고 자식 엔티티들은 상속을 통해 BaseEntity
의 매핑 정보를 물려받았다.
여기서는 BaseEntity
는 테이블과 매핑할 필요가 없고 자식 엔티티에게 공통으로 사용되는 매핑 정보만 제공하면 된다!
@AttributeOverrides / @AttributeOverride
부모로부터 물려받은 매핑 정보를 재정의
@Entity@AttributeOverride(name="id", column= @Column(name="MEMBER_ID"))public class Member extends BaseEntity {...}둘 이상 재정의 시
@ENtity@AttributeOverrides({@AttributeOverride(name="id", column= @Column(name="MEMBER_ID")),@AttributeOverride(name="name", column= @Column(name="MEMBER_NAME"))})public class Member extends BaseEntity {...}
@MappedSuperclass의 특징
- 테이블과 매핑되지 않고 자식 클래스에 엔티티의 매핑 정보를 상속하기 위해 사용
@MappedSuperclass
로 지정한 클래스는 엔티티가 아니므로em.find()
나 JPQL에서 사용할 수 없다.
- 이 클래스를 직접 생성해서 사용할 일은 거의 없으므로 추상 클래스로 만드는 것을 권장한다. =>
반드시 추상 클래스여야 하는 것은 아니였다!
정리하자면, @MappedSuperclass
는 테이블과 관계가 없고 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모아주는 역할을 한다.
=> 등록일자, 수정일자, 등록자, 수정자 같은 여러 엔티티에서 공통으로 사용하는 속성을 효과적으로 관리할 수 있다.
참고로, 엔티티는 엔티티이거나 @MappedSuperclass로 지정한 클래스만 상속받을 수 있다.
ORM에서의 진정한 상속 매핑은 7-(1) 상속 관계 매핑
에서 학습한 객체 상속을 데이터베이스의 슈퍼타입 서브타입 관계와 매핑하는 것이다.