Study/JPA

[JPA] @MappedSuperclass

오늘만 사는 여자 2022. 4. 19. 16:50
728x90
반응형

 

@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 Team extends BaseEntity {
        ...
      }
    • @Entity
      public class Member 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



출처: https://ict-nroo.tistory.com/129 [개발자의 기록습관]

728x90
반응형