[JPA] @MappedSuperclass
15 Jul 2022해당 포스트는 인프런 김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 을 듣고 정리한 글입니다.
@MappedSuperclass
해당 어노테이션은 공통 매핑 정보가 필요할 때 사용한다 (id, name)
@MappedSuperclass 란?
- 상속관계 매핑X
- 엔티티X, 테이블과 매핑X
- 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공
- 조회, 검색 불가(em.find(BaseEntity.class) 불가)
- 직접 생성해서 사용할 일이 없으므로 추상 클래스 권장
예제 코드
예시를 들어 간단하게 설명해보자
아래의 필드들은 주로 테이블에 공통적으로 자주 들어가는 필드들이다.
private String createdBy;
private LocalDateTime createDate;
private String lastModifiedBy;
private LocalDateTime lastModifiedDate;
위와 같은 필드를 Entity마다 넣어주는 것이 아니라. 아래와 같은 부모의 superclass로 만들어줄 수 있다.
@Getter @Setter
@MappedSuperclass
public class BaseEntity {
private String createdBy;
private LocalDateTime createDate;
private String lastModifiedBy;
private LocalDateTime lastModifiedDate;
}
그리고 아래와 같이 사용하고자 하는 Entity에 상속해 주면 된다.
@Entity
@Getter @Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Member extends BaseEntity{
@Id
private Long id;
private String name;
public Member(Long id, String name) {
this.id = id;
this.name = name;
}
}
그럼 BaseEntity
를 상속받은 Member
Entity를 사용해 보자.
Member member = new Member(101L, "Hello JPA");
member.setCreatedBy("mho");
member.setCreateDate(LocalDateTime.now());
entityManager.persist(member);
그럼 아래와 같이 BaseEntity
를 상속받아 테이블이 만들어진다.
create table Member (
id bigint not null,
createDate timestamp,
createdBy varchar(255),
lastModifiedBy varchar(255),
lastModifiedDate timestamp,
name varchar(255),
primary key (id)
)
정리
- 테이블과 관계 없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할
- 주로 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통으로 적용하는 정보를 모을 때 사용
- 참고:
@Entity
클래스는 엔티티나@MappedSuperclass
로 지정한 클래스만 상속 가능