개발/spring boot
[어노테이션] @MappedSuperclass
nix-be
2022. 9. 7. 10:24
728x90
- 객체의 입장에서 공통 매핑 정보가 필요할 때 사용
- id , name 은 객체의 입장에서 볼 때 계속 사용
- 공통 매핑 정보가 필요할 때, 부모 클래스에 선언하고 속성만 상속 받아서 사용하고 싶을 때 @MappedSuperclass 사용
- DB 테이블과는 상관 없다. DB 매핑 정보는 다 따로 사용
1. 코드 확인
- 생성자, 생성시간, 수정자 ,수정시간을 모든 엔티티에서 공통으로 가져가야 하는 상황에서 아래와 같이 BaseEntity를 정의해 활용 가능
- BaseEntity.java 매핑정보만 상속받는 superclass라는 의미의 @MappedSuperclass 어노테이션 선언
@Getter
@Setter
@MappedSuperclass
public abstract class BaseEntity {
private String createdBy;
private LocalDateTime createdDate;
private String lastModifiedBy;
private LocalDateTime lastModifiedDate;
}
- Meber.java Team.java
- BaseEntity 상속
@Entitypublic class Member extends BaseEntity {
...
}
@Entitypublic class Team extends BaseEntity {
...
}
- 실행된 DDL
Hibernate:
create table Member (
id bigint generated by default as identity,
createdBy varchar(255),
createdDate timestamp,
lastModifiedBy varchar(255),
lastModifiedDate timestamp,
age integer,
description clob,
roleType varchar(255),
name varchar(255),
locker_id bigint,
team_id bigint,
primary key (id)
)
Hibernate:
create table Team (
id bigint generated by default as identity,
createdBy varchar(255),
createdDate timestamp,
lastModifiedBy varchar(255),
lastModifiedDate timestamp,
name varchar(255),
primary key (id)
)
2. 정리
- 상속관계 매핑이 아니다
- @MappedSuperclass가 선언되어 있는 클래스는 Entity가 아니다. 당연히 테이블과 매핑 안된다.
- 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공
- 조회, 검색이 불가능 부모 타입으로 조회하는 것이 불가능 em.find(BaseEntity) 불가능
- 직접 생성해서 사용할 일이 없음 그래서 추상 클래스로 만드는 것을 권장
- 테이블과 관계가 없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할을 한다.
- 주로 등록일,수정일 , 등록자, 수정자 같은 전체 엔티티에서 공통으로 적용하는 정보를 모을 때 사용한다.
- Jpa에서 @Entity 클래스는 @Entity 나 @MappedSuperclass로 지정한 클래스만 상속할 수 있다.
참고
728x90