[인프런 김영한] JPA - @MappedSuperclass

2021. 2. 9. 18:02프로그래밍 언어/Spring Framework

[인프런 김영한] JPA - @MappedSuperclass


해당 글은 인프런 김영한강사님의 영상을 보고 정리한 글입니다.

Spring Boot, Spring Data JPA를 사용해 실습하였습니다.

김영한 인프런 : www.inflearn.com/users/@yh

 

인프런 - 김영한의 강의들을 만나보세요.

우아한형제들 개발 팀장 (전: 카카오, SK플래닛) 저서: 자바 ORM 표준 JPA 프로그래밍

www.inflearn.com


▣ @MappedSuperclass

* 공통 매핑 정보가 필요할 떄 사용

 - DB입장에서는 공통의 컬럼이 있어도 각각 존재하지만 객체입장에서는 공통 컬럼을 한곳에 묶어서 사용하고 싶을때.

 

* 상속관계 매핑이 X

* MappedSuperclass 어노테이션을 붙은 테이블은 Entity가 아니다. 테이블과 매핑X

* 조회, 검색이 불가.

* 직접 생성해서 사용할 일이 없기때문에 추상클래스를 권장

 

※ 참고 : @Entity 클래스는 Entity 혹은 @MappedSuperclass로 지정한 클래스만 상속 가능

 

 


 

BaseEntity

@MappedSuperclass
public abstract class BaseEntity {

    //  Member와 Team에 공통으로 들어간다.
    private String createdBy;
    private LocalDateTime createdDate;
    private String lastModifiedBy;
    private LocalDateTime lastModifiedDate;

}

 

Member

@Entity
public class Member extends BaseEntity{

    @Id
    @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;

    private String name;

    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    private Team team;
}

 

Team

@Entity
public class Team extends BaseEntity{

    @Id
    @GeneratedValue
    @Column(name = "TEAM_ID")
    private Long id;
    private String name;

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

 

실행문

Member member = new Member();
member.setName("user1");
member.setCreatedBy("kim");
member.setCreatedDate(LocalDateTime.now());
memberRepository.save(member);

 

 실행결과

 

// 테이블 생성
Hibernate:
    create table member (
       member_id bigint not null,
        created_by varchar(255),
        created_date timestamp,
        last_modified_by varchar(255),
        last_modified_date timestamp,
        name varchar(255),
        team_id bigint,
        primary key (member_id)
    )
Hibernate:
    create table team (
       team_id bigint not null,
        created_by varchar(255),
        created_date timestamp,
        last_modified_by varchar(255),
        last_modified_date timestamp,
        name varchar(255),
        primary key (team_id)
    )
    
// insert문
insert 
    into
member
    (created_by, created_date, last_modified_by, last_modified_date, name, team_id, member_id) 
values
    (?, ?, ?, ?, ?, ?, ?)
    

| 각각의 테이블에 BaseEntity에 추가한 컬럼이 들어있으며 insert 할 떄 역시 해당 컬럼에 매핑되어 insert 된다.