- 참조: 자바 ORM 표준 JPA 프로그래밍
- @MappedSuperclass
앞에서 살펴본 슈퍼타입과 서브타입에서는 부모 클래스와 자식 클래스를 모두 테이블과 맵핑했다. @MappedSuperclass 를 이용하면 부모 클래스는 테이블과 맵핑하지 않고, 상속 받는 자식 클래스에게 맵핑 정보만 제공할 수 있다. 즉 @Entity 는 실제 테이블과 맵핑되지만 @MappedSuperclass 는 실제 테이블과 맵핑되지 않는다.
위와 같이 MEMBER 와 SELLER 테이블이 있지만, MEMBER 와 SELLER 는 비즈니스적인 관계가 없다고 가정하자. 관계는 없지만 ID 와 NAME 을 공통된 속성으로 사용하고 싶을 때가 있다.
이를 UML 로 표현해보면 위와 같이 된다. BaseEntity 에 id, name 속성이 있으며 이를 상솓받는 Member, Seller 가 있다.
@MappedSuperclass
public abstract class BaseEntity {
@Id @GeneratedValue
private Long id;
private String name;
............
@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;
...........
@Entity
public class Seller extends BaseEntity {
private String shopName;
부모 클래스에 해당하는 BaseEntity 에 @MappedSuperclass 어노테이션을 붙여준다. Member 와 Seller 는 이를 상속하기만 하면 BaseEntity 의 속성들이 추가된다.
Member 엔티티에서 @AttributeOverrides 어노테이션이 보이는데, 이는 부모의 맵핑 정보를 재정의 하기 위함이다. 단일 건일 경우 @AttributeOverride 를 사용하면 된다.
public static void save(EntityManager em) {
EntityTransaction tx = em.getTransaction();
tx.begin();
Member member = new Member();
member.setName("NAME#1");
member.setEmail("EMAIL#1");
em.persist(member);
Seller seller = new Seller();
seller.setName("NAME#2");
seller.setShopName("SHOP_NAME#1");
em.persist(seller);
tx.commit();
em.close();
}
위와 같이 테스트 코드를 작성하여 테이블을 조회해보자.
MEMBER 테이블은 어노테이션을 통해 맵핑 정보를 재정의한대로 MEMBER_ID 와 MEMBER_NAME 으로 컬럼이름이 변경되었다. 반면 SELLER 는 부모의 ID 와 NAME 컬럼을 그대로 이용한다.
@MappedSuperclass 는 엔티티가 아니므로 em.find 나 JPQL 에서 사용할 수 없다. @Inheritance 와 비슷한것 같지만 둘의 사용용도는 다르다. @Inheritance 는 슈퍼타입과 서브타입 관계를 맵핑하는것이지만 @MappedSuperclass 는 엔티티들이 사용하는 공통 속성들을 모아놓은것일 뿐이다.
보통 현업에서는 insert_date, insert_user_id, update_date, update_user_id 와 같이 공통적인 컬럼들을 정의해서 @MappedSuperclass 를 사용하기도 한다.
'Framework and Tool > JPA' 카테고리의 다른 글
JPA - 고급맵핑 - 조인 테이블 (0) | 2021.07.12 |
---|---|
JPA - 고급맵핑 - 복합키와 식별 관계 맵핑 (2) | 2021.07.11 |
JPA - 고급맵핑 - 슈퍼타입과 서브타입 (0) | 2021.07.10 |
JPA - 다양한 연관관계 - 요구사항 분석과 맵핑 2 (0) | 2021.07.10 |
JPA - 다양한 연관관계 - M : N 비식별관계 (0) | 2021.07.10 |
댓글