JPA - @MappedSuperClass (매핑정보 상속)

2021. 4. 16. 01:07 Spring Data/Spring Data JPA

@MappedSuperClass

바로 직전의 포스트에서는 JPA에서의 엔티티 상속 전략에 대해서 다루었다. 이번에 다룰 것은 비슷한 상속개념이지만, 이전 포스트 글과는 다르게 부모에 해당하는 클래스가 테이블과 매핑되는 것이 아니라, 단순 상속받는 엔티티에게 매핑정보만 상속해주는 것이다. 즉, 객체들이 주로 사용하는 공통 매핑정보등을 정의하여 그 매핑정보를 엔티티들에게 상속해주는 것이다.

 

@MappedSuperclass
@Getter
@Setter
public abstract class BaseEntity {
    @Id
    @Column(name = "BASE_ID")
    @GeneratedValue(strategy=GenerationType.TABLE, generator = "HUMAN_SEQ_GENERATOR")
    @TableGenerator(
            name="HUMAN_SEQ_GENERATOR",
            table="MY_SEQUENCE",
            pkColumnName="SEQ_NAME", //MY_SEQUENCE 테이블에 생성할 필드이름(시퀀스네임)
            pkColumnValue="HUMAN_SEQ", //SEQ_NAME이라고 지은 칼럼명에 들어가는 값.(키로 사용할 값)
            allocationSize=1
    )
    private Long id;
 
    private String name;
 
    @Temporal(TemporalType.TIMESTAMP)
    private Date created = new Date();
}
 
@Entity
@Getter
@Setter
@AttributeOverride(name = "id", column = @Column(name = "EMPLOYEE_ID"))
public class Employee extends BaseEntity{
    private String email;
}

 

코드만 보더라도 직관적이다. @MappedSuperClass 어노테이션이 붙은 추상클래스가 매핑정보를 상속해줄 클래스이다. 코드에서 보듯이 공통적인 매핑정보를 가지고 있다. 여기서 한가지 중요한 것은 @MappedSuperClass가 붙은 클래스는 절대 엔티티가 아니기 때문에 영속성컨텍스트에서 별도로 가지고 올 수 없다.

 

밑의 엔티티 클래스에서 설명할 어노테이션은 @AttributeOverride이다.  만약 추상클래스에서 정의한 컬럼명을 그대로 상속받는 것이 아니고 컬럼명을 변경하고 싶을 때는 위 어노테이션을 써서 변경하면 된다. 만약 변경할 컬럼이 여러개라면 

 

@AttributeOverrides({
    @AttributeOverride(name = "id", column = @Column = .....
    ,@AttributeOverride(name = "name", column = @Column = .....
})

 

로 매핑정보들을 오버라이드 할 수 있다.



출처: https://coding-start.tistory.com/80?category=781616 [코딩스타트]