개발/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