흰 스타렉스에서 내가 내리지

@MappedSuperclass 본문

JPA

@MappedSuperclass

주씨. 2024. 4. 3. 22:46
728x90

# 언제 사용하라고?

  • 부모 클래스는 테이블과 매핑하지 않고,  부모 클래스를 상속 받는 자식 클래스에게 매핑 정보만 제공하고 싶을 떄

 

# 비유를 하자면..

  • 추상 클래스와 비슷하다
  • @Entity 는 실제 테이블과 매핑되지만, @MappedSuperclass 는 실제 테이블과는 매핑되지 않는다.
  • 단순히 매핑 정보를 상속할 목적으로만 사용된다.

 

 

 

  • Member 와 Seller 는 서로 관계가 없는 테이블과 엔티티다. 
  • 테이블은 그대로 두고 객체 모델의 id, name 두 공통 속성을 부모 클래스로 모으고 객체 상속 관계로 만들어보자

 

@MappedSuperclass
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 에는 객체들이 주로 사용하는 공통 매핑 정보를 정의한다. 
  • 그리고 자식 엔티티들은 상속을 통해 BaseEntity 의 매핑 정보를 물려받았다.
  • BaseEntity 는 테이블과 매핑할 필요가 없고 자식 엔티티에게 공통으로 사용되는 매핑 정보만 제공하면 된다. 따라서 @MappedSuperclass 를 사용했다.

 

# 부모의 매핑 정보를 재정의 하고 싶다

  • @AttributeOverride 나 @AttributeOverrides 사용
@Entity
@AttributeOverride(name = "id", column = @Column(name = "MEMBER_ID"))
public class Member extends BaseEntity{
    private String email;
}

@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;
}

 

  • 부모에게 상속받은 id 속성의 컬럼명을 MEMBER_ID 로 재정의 했다.
  • 둘 이상을 재정의 하려면 @AttributeOverrides 를 사용하면 된다. 

 

 

# @MappedSuperclass 의 특징

  • 테이블과 매핑되지 않고 자식 클래스에 엔티티의 매핑 정보를 상속하기 위해 사용한다.
  • @MappedSuperclass 로 지정한 클래스는 엔티티가 아니므로 em.find() 나 JPQL 에서 사용할 수 없다.

 

 

# @MappedSuperclass 를 사용하면 등록일자, 수정일자, 등록자, 수정자 같은 여러 엔티티에서 공통으로 사용하는 속성을 효과적으로 관리할 수 있다. 

'JPA' 카테고리의 다른 글

복합 키 : 비식별 관계 매핑  (1) 2024.04.04
식별 관계 vs 비식별 관계  (0) 2024.04.04
연관관계 편의 메소드  (0) 2024.04.02
필드와 컬럼 매핑 : 레퍼런스  (0) 2024.04.01
유니크 제약조건 - uniqueConstraints  (0) 2024.04.01