Spring & Spring Boot
[JPA] 고급 매핑 (2) @MappedSuperclass
Serina_Heo
2023. 5. 9. 12:19
(1) 상속관계 매핑은 부모 클래스와 자식 클래스를 모두 DB 테이블과 매핑한 것.
부모 클래스는 테이블과 매핑하지 않고 부모 클래스를 상속받는 자식 클래스에게 매핑 정보만 제공하고 싶으면 @MappedSuperclass 를 사용하면 됨. 실제 DB 테이블과 매핑되는 @Entity 와는 다르게 @MappedSuperclass 는 단순히 매핑 정보를 상속할 목적으로만 사용 됨.
@MappedSuperclass
public abstract class BaseEntity {
@Id @GeneratedValue
private Long id;
private String name;
...
}
@Entity
public class Member extends BaseEntity {
// ID 상속
// NAME 상속
private string email;
...
}
@Entity
public class Seller extends BaseEntity {
// ID 상속
// NAME 상속
private string shopName;
...
}
객체들이 주로 사용하는 공통 매핑 정보는 BaseEntity 에 정의함.
자식 엔티티는 상속을 통해 BaseEntity 의 매핑 정보를 물려받음.
만약 부모로 부터 물려받은 매핑 정보를 재정의하려면 @AttributeOverrides 나 @AttributeOverride 를 사용하고 ,
연관관계를 재정의하려면 @AssociationOverrides 나 @AssociationOverride 를 사용.
아래 코드는 부모에게 상속받은 id 속성의 컬럼명을 MEMBER_ID 로 재정의 한 예시코드.
둘 이상을 재정의하려면 @AttributeOverrides 를 사용.
@Entity
@AttributeOverride(name = "id", column = @Column(name = "MEMBER_ID"))
public class Member extends BaseEntity { ... }
@MappedSuperclass 의 특징
- 테이블과 매핑되지 않고 자식 클래스에 엔티티의 매핑 정보를 상속하기 위해 사용
- MappedSuperclass 로 지정한 클래스는 엔티티가 아니므로 em.find() 나 JPQL 에서 사용불가
- 이 클래스를 직접 생성해서 사용할 일을 거의 없으므로 추상 클래스로 만드는 것을 권장함
-> @MappedSuperclass 는 테이블과는 관계가 없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모아주는 역할을 할 뿐.
이를 이용하여 등록일자, 등록자, 수정일자, 수정자 등 여러 엔티티에서 공통으로 사용하는 속성을 효과적으로 관리할 수 있음.
Reference : 자바 ORM 표준 JPA 프로그래밍 (김영한 저)