JPA

[JPA] @MappedSuperclass

행복하개! 2020. 10. 20. 16:20

 

 

 

이 어노테이션은 데이터베이스 객체지향과 설계상의 상속관계가 아니고, 그냥 단순하게 공통 매핑 정보가 필요할때 사용한다. 

 

예를 들어 id나 name들은 자주 반복되므로 abstract 클래스를 따로 두고 필요할때 상속해서 사용하는 방법이다.

 

따라서 정리하자면 상속관계 매핑이 아니고, 엔티티 테이블 매핑도 아니고 그저 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공하는 방식이다. 당연히 엔티티가 아니기 때문에 조회나 검색이 불가능하다. 

 

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

 

즉, 직접 사용할 일이 없기 때문에 추상 클래스 (abstract) 클래스로 만들어 사용한다.

 

※ @Entity 클래스는 @Entity나 @MappedSuperclass 클래스만 상속가능

 

 

 

예시 코드 :

@MappedSuperclass
public abstract class BaseEntity {

    private String createBy;
    private LocalDateTime createDate;
    private String lastModifiedBy;
    private LocalDateTime lastModifiedDate;

    public String getCreateBy() {
        return createBy;
    }

    public void setCreateBy(String createBy) {
        this.createBy = createBy;
    }

    public LocalDateTime getCreateDate() {
        return createDate;
    }

    public void setCreateDate(LocalDateTime createDate) {
        this.createDate = createDate;
    }

    public String getLastModifiedBy() {
        return lastModifiedBy;
    }

    public void setLastModifiedBy(String lastModifiedBy) {
        this.lastModifiedBy = lastModifiedBy;
    }

    public LocalDateTime getLastModifiedDate() {
        return lastModifiedDate;
    }

    public void setLastModifiedDate(LocalDateTime lastModifiedDate) {
        this.lastModifiedDate = lastModifiedDate;
    }
}

 

상속한 코드 : 

@Entity
public class Team extends BaseEntity {
    @Id
    @GeneratedValue
    @Column(name = "TEAM_ID")
    private Long id;
    private String name;

    @OneToMany
    @JoinColumn(name = "TEAM_ID")
    private List<Member> members = new ArrayList<>();

    public List<Member> getMembers() {
        return members;
    }

    public void setMembers(List<Member> members) {
        this.members = members;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

 

이렇게 상속하면 BaseEntity에 존재하는 컬럼이 같이 생성 된다.