Free Lines Arrow
본문 바로가기
DataBase/JPA

[JPA] @MappedSuperclass

by skahn1215 2021. 8. 9.
728x90
반응형

@MappedSuperclass

  • 해당 어노테이션은 공통속성을 만들어서 사용할때 쓴다.
  • 테이블과 관계 없고 단순히 공통으로 사용하는 정보를 모으는 역할만한다.

 

 

 

 

언제쓸까?

예를 들어 대부분 테이블에 다음과 같은 속성이 들어가야된다 해보자

  • createBy(생성한사람)
  • createTime(생성시간)
  • modifiedBy(수정자)
  • lastModifiedTime(마지막 수정시간)

그렇다면 JPA 에서 모든 클래스를 전부다 찾아서 넣어줘야 될까?

절대 아니다 MappedSuperclass 로 공통 클래스를 하나 만들고 상속만 해주면된다.

 

 

 

 

구현

 

 

공통 클래스 구현

  • @MappedSuperclass 어노테이션을 붙여서 공통클래스를 설정해주었다.
// 해당 어노테이션을 쓰면
// 상속 받은 모든 클래스에 해당 속성만 들어가게 된다.
// 속성을 공통으로 관리 할때 쓴다.
@MappedSuperclass
public abstract class BaseEntity {

    // 모든 테이블에 다 들어가야한다.
    // 속성만 상속 받아서 쓰고 싶다.
    private String createBy;
    private LocalDateTime createDate;
    private String lastModifiedBy;
    private LocalDateTime lastModifiedDate;
}

 

 

상속

  • BaseEntity 를 상속받았다. 그렇게 되면 Member Table에 공통 속성이 들어가게 된다.
@Entity
public class Member extends BaseEntity {
    @Id //PK 설정
    @GeneratedValue
    @Column(name = "OTO_MEMBER_ID")
    private Long id;

    // 컬럼이름을 지정해준다.
    private String name;

    @OneToOne
    @JoinColumn(name = "OTO_LOCKER_ID")
    private Locker locker;

    //JPA 는 기본생성자가 있어야 한다.
    public Member() {
    }
}

 

 

 

결과

테이블이 생성이 되었다.

Hibernate: 

create table Member (
       OTO_MEMBER_ID bigint not null,
        createBy varchar(255),
        createDate timestamp,
        lastModifiedBy varchar(255),
        lastModifiedDate timestamp,
        name varchar(255),
        OTO_LOCKER_ID bigint,
        primary key (OTO_MEMBER_ID)
    )

 

 

 

 

특징

  • 상속관계 맵핑이 아니다 단순히 속성만 사용하는것이다.
  • 엔티티가 아니다 그렇기 때문에 테이블과 맵핑이 안된다.
  • 상속받는 자식클래스에 매핑 정보만 제공해준다.
  • 조회 검색 불가 하다. 
    em.find(BaseEntity) 는 불가능하다.
  • 직접생성해서 사용하는 일이 없다 추상클래스로 만들자.

 

 

 

 

728x90
반응형

'DataBase > JPA' 카테고리의 다른 글

[JPA] Lazy 와 Eager  (0) 2021.08.19
[JPA] 프록시  (0) 2021.08.11
[JPA] 고급 매핑1: 상속관계 맵핑  (0) 2021.08.08
[JPA] 다양한 연관관계 맵핑  (0) 2021.08.07
[JPA] 연관관계 매핑기초5: 예제  (0) 2021.08.04

댓글