티스토리 뷰

ICT Eng/JPA

[JPA] @MappedSuperclass

nroo 2019. 8. 26. 19:45


@MappedSuperclass

  • 객체의 입장에서 공통 매핑 정보가 필요할 때 사용한다.

  • id, name은 객체의 입장에서 볼 때 계속 나온다.

  • 이렇게 공통 매핑 정보가 필요할 때, 부모 클래스에 선언하고 속성만 상속 받아서 사용하고 싶을 때 @MappedSuperclass를 사용한다.

  • DB 테이블과는 상관없다. 아래에 보면 DB는 매핑 정보 다 따로 쓰고 있다. 객체의 입장이다.

코드로 이해하기

  • 생성자, 생성시간, 수정자, 수정시간을 모든 엔티티에 공통으로 가져가야 하는 상황에서

  • 아래와 같이 BaseEntity를 정의해서 활용할 수 있다.

  • BaseEntity.java

    • 매핑정보만 상속받는 Superclass라는 의미의 @MappedSuperclass 어노테이션 선언

    @Getter
    @Setter
    @MappedSuperclass
    public abstract class BaseEntity {

       private String createdBy;

       private LocalDateTime createdDate;

       private String lastModifiedBy;

       private LocalDateTime lastModifiedDate;
    }
  • Member.java, Team.java

    • BaseEntity 상속

      @Entity
      public class Member extends BaseEntity {
        ...
      }
      @Entity
      public class Team extends BaseEntity {
        ...
      }
  • 실행된 DDL

    • BaseEntity에 선언된 컬럼들이 생성 된다.

      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)
        )
      ...

정리

  • 상속광계 매핑이 아니다.

  • @MappedSuperclass가 선언되어 있는 클래스는 엔티티가 아니다. 당연히 테이블과 매핑도 안된다.

  • 단순히 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공한다.

  • 조회, 검색이 불가하다. 부모 타입으로 조회하는 것이 불가능하다는 이야기.(em.find(BaseEntity) 불가능)

  • 직접 생성해서 사용할 일이 없으므로 추상 클래스로 만드는 것을 권장한다.

  • 테이블과 관계가 없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할을 한다.

  • 주로 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통으로 적용하는 정보를 모을 때 사용한다.

  • 참고

    • JPA에서 @Entity 클래스는 @Entity나 @MappedSuperclass로 지정한 클래스만 상속할 수 있다.

Reference


댓글