부모 클래스는 테이블과 매핑하지 않고 부모 클래스를 상속받는 자식 클래스에게 매핑 정보만 제공하고 싶으면 @MappedSuperClass를 사용하면 된다.
@MappedSuperClass는 비유를 하자면 추상 클래스와 비슷한데 @Entity는 실제 테이블과 매핑되지만 @MappedSuperClasssms 실제 테이블과 매핑되지 않는다. 단순히 매핑정보를 상속할 목적으로만 사용된다.
@MappedSuperClass
public abstract class BaseEntity {
@Id @GeneratedValue
private Long id;
private String name;
}
@Entity
public class Member extends BaseEntity {
//ID 상속
//NAME 상속
private String email;
}
BaseEntity에는 객체들이 주로 사용하는 공통 매핑 정보를 정의했다. 그리고 자식 엔티티들은 상속을 통해 BaseEntity의 매핑정보를 물려받았다. 여기서 BaseEntity는 테이블과 매핑할 필요가 없고 자식 엔티티에게 공통으로 사용되는 매핑 정보만 제공하면 된다. 따라서 @MappedSuperClass를 사용했다.
부모로 받은 매핑정보를 재정의하려면 @AttributeOverrides, @AttributeOverride를 사용하고, 연관관계를 재정의하려면 @AssociationOverrides, @AssociationOverride를 사용한다.
@Entity
@AttributeOverrides({
@AttributeOverride(name = "id", column = @Column(name = "MEMBER_ID")),
@AttributeOverride(name = "name", column = @Column(name = "MEMBER_NAME"))
})
public class Member extends BaseEntity {}
- 테이블과 매핑되지 않고 자식 클래스에 엔티티의 매핑 정보를 상속하기 위해서 사용한다.
- @MappedSuperClass로 지정한 클래스는 엔티티가 아니므로 em.find()나 JPQL에서 사용할 수 없다.
- 이 클래스를 직접 생성해서 사용할 일은 거의 없으므로 추상 클래스로 만드는 것을 권장한다.
정리하자면 @MappedSuperClass는 테이블과는 관계없고 단순히 엔티티가 공통으로 사용하는 매핑정보를 모아주는 역할을 할 뿐이다.
@MappedSuperClass를 사용하면 등록일자, 수정일자, 등록자, 수정자 같은 여러 엔티티에서 공통으로 사용하는 속성을 효과적으로 관리할 수 있다.
엔티티는 @Entity이거나 @MappedSuperClass로 지정한 클래스만 상속받을 수 있다.
'JPA' 카테고리의 다른 글
13.1 트랜잭션 범위의 영속성 컨텍스트 (0) | 2021.01.28 |
---|---|
7.3.3 복합키 : 식별관계 매핑 (0) | 2021.01.17 |
7.1 상속관계 매핑 (0) | 2021.01.17 |
8.6 영속성 전이 + 고아객체, 생명주기 (0) | 2021.01.17 |
8.5 고아객체 (0) | 2021.01.16 |