@MappedSuperclass는 명칭과 같이 상속관계에서 부모 클래스를 매핑 할 때 사용합니다.
기존의 상속관계 매핑에서는 부모 자식 테이블 모두 엔티티로 생성하여 매핑을 하지만, @MappedSuperclass는 부모 클래스는 엔티티로 생성하지 않고 자식 클래스만 엔티티로 생성합니다.
이는 단순히 매핑 정보(엔티티 컬럼)를 상속할 목적으로 사용 됩니다.
예제)
예를들어 위와 같이 MANAGER, EMPLOYEE 테이블이 있다고 할 때, 두 테이블에는 ID와 NAME이 공통으로 있는 것을 보실 수 있습니다. 이 두 컬럼을 부모클래스로 생성해 위의 두 테이블의 엔티티가 상속받도록 합니다.
@MappedSuperclass
public abstract class CommonEntity {
@Id
@Column(name = "id")
private Long id;
@Column(name = "NAME")
private String name;
...
}
@Entity
public class Manager extends CommonEntity {
@Column(name = "EMAIL")
private String email;
...
}
@Entity
public class Employee extends CommonEntity {
@Column(name = "TEL_NO")
private String telNo;
...
}
CommonEntity의 경우 new를 사용해 직접 생성할 일이 없으므로 abstract class 로 생성합니다.
@MappedSuperclass 로 설정한 클래스는 엔티티가 아니기 때문에 find() 나 JPQL 에서 사용할 수 없습니다. 위에서 말씀드린데로, 단순하게 공통으로 사용하는 매핑 정보를 모아놓는 역할을 할 뿐입니다.
모든 테이블에서 공통적으로 사용되는 등록일자, 수정일자 등을 선언해 사용할 수 있지만, 검색이 불가하기 때문에 활용도는 그다지 높지 않을 것으로 판단됩니다.
모든 엔티티에 공통적으로 사용되지만, 검색 할 일이 없는 컬럼의 경우 @MappedSuperclass를 사용하여 관리하시면 됩니다.
참고로 엔티티는 @MappedSuperclass와 @Entity로 설정한 클래스만 상속을 받을 수 있습니다.
'Programing > JPA' 카테고리의 다른 글
JPA Entity 내 Subquery 로 동작하는 속성 추가 방법 @Formula (0) | 2024.05.08 |
---|---|
JPA 부모, 자식 관계에서 부모 삭제 시 모든 경우의 수를 알아보자 Cascade, orphanRemoval 차이, 벌크연산 (0) | 2024.04.05 |
JPA could not initialize proxy - no Session 원인 / 해결방법 (1) | 2023.08.24 |
@IdClass @EmbeddedId 의 활용 차이 (0) | 2023.08.18 |
JPA 연관관계 매핑 알짜만 빼먹기. 일대일 일대다 다대일 다대다 (0) | 2023.08.18 |
댓글