티스토리 뷰
@MappedSuperclass 이란?
객체들 간에 공통된 필드가 있을 때 @MappedSuperclass 객체를 상속받아서 이런 공통된 필드를 매핑해 준다. 예를 들어 여러 테이블에 생성자 ID, 생성 시간, 수정자 ID, 수정 시간의 속성이 필요하다면 객체마다 공통된 필드를 일일이 선언하는 것이 아닌 @MappedSuperclass 객체를 상속받으면 해결된다.
예제
아래 예제에서 두 개의 게시판 객체가 있는데 두개의 게시판은 생성자 ID, 생성 시간, 수정자 ID, 수정 시간의 공통 필드가 존재한다. 두 개의 게시판 객체를 @MappedSuperclass 선언된 객체를 상속받기 전과 후로 테스트해보았다.
@MappedSuperclass 선언 전
@Entity
public class Board1 {
@Id
@GeneratedValue
private Long id;
private String createdId;
private LocalDateTime createDate;
private String modifyId;
private LocalDateTime modifyDate;
}
@Entity
public class Board2 {
@Id
@GeneratedValue
private Long id;
private String createdId;
private LocalDateTime createDate;
private String modifyId;
private LocalDateTime modifyDate;
}
Hibernate:
create table Board1 (
createDate timestamp(6),
id bigint not null,
modifyDate timestamp(6),
createdId varchar(255),
modifyId varchar(255),
primary key (id)
)
Hibernate:
create table Board2 (
createDate timestamp(6),
id bigint not null,
modifyDate timestamp(6),
createdId varchar(255),
modifyId varchar(255),
primary key (id)
)
두 개의 객체를 엔티티로 선언 후 실행한 결과 테이블이 정상적으로 생성되었다.
@MappedSuperclass 선언 후 객체 상속
@MappedSuperclass
public abstract class BoardCommonMapping {
private String createdId;
private LocalDateTime createDate;
private String modifyId;
private LocalDateTime modifyDate;
}
위의 @MappedSuperclass으로 선언된 객체를 보면 Board1, Board2의 공통 필드인 생성자 ID, 생성 시간, 수정자 ID, 수정 시간이 있다는 걸 확인할 수 있다. 이제 Board1, Board2의 객체를 @MappedSuperclass으로 선언 된 객체 상속받으면 아래와 같다.
@Entity
public class Board1 extends BoardCommonMapping{
@Id
@GeneratedValue
private Long id;
}
@Entity
public class Board2 extends BoardCommonMapping{
@Id
@GeneratedValue
private Long id;
}
Hibernate:
create table Board1 (
createDate timestamp(6),
id bigint not null,
modifyDate timestamp(6),
createdId varchar(255),
modifyId varchar(255),
primary key (id)
)
Hibernate:
create table Board2 (
createDate timestamp(6),
id bigint not null,
modifyDate timestamp(6),
createdId varchar(255),
modifyId varchar(255),
primary key (id)
)
위의 실행 결과를 확인해 보니 위와 같이 문제없이 정상적으로 생성되었다. 다만 BoardCommonMapping의 객체는 테이블이 생성되지 않았다. 참고로 BoardCommonMapping 객체는 추상 클래스로 선언했는데 그냥 클래스로 선언해도 상관은 없다. 하지만 BoardCommonMapping 객체를 생성을 방지하기 위해서 추상 클래스로 선언한 것이다.
정리
@MappedSuperclass으로 선언된 객체는 엔티티랑 테이블과 무관하며, 상속받은 자식 클래스에 매핑 정보(객체의 필드, 테이블의 속성)만 제공해 준다. 따라서 em.find( @MappedSuperclass 선언된 객체)으로 조회, 검색이 불가하며, 전체 엔티티에서 공통으로 필요한 필드를 매핑할 때 사용한다.
본 포스팅은 “자바 ORM 표준 JPA 프로그래밍 - 기본 편/인프런”를 학습한 내용을 정리한 것
'Java > JPA' 카테고리의 다른 글
| <JPA> @Enumerated 사용 시 주의할 점 (0) | 2024.10.31 |
|---|---|
| <JPA> 벌크 연산시 주의할 점 (2) | 2024.10.03 |
| <JPA> 준영속 엔티티를 수정하는 2가지 방법 (0) | 2024.09.30 |
| <JPA> 임베디드 타입이란? (0) | 2024.09.24 |
| <JPA> 즉시 로딩과 지연 로딩이란? (0) | 2024.09.23 |
