728x90
여러 엔티티에서 공통적으로 사용하는 속성들을 부모 클래스로 뽑아내고, @MappedSuperClass 애노테이션을 적용하면 DB 테이블에는 영향을 주지 않고 코드상 중복을 제거할 수 있다.
@Entity
public class Teacher {
@Id @GeneratedValue
@Column(name = "teacher_id")
private Long id;
private String name;
private String subject;
}
@Entity
public class Student {
@Id @GeneratedValue
@Column(name = "student_id")
private Long id;
private String name;
private String grade;
}
예를 들어 다음과 같이 Student, Teacher 엔티티가 있다고 가정해보자. 두 엔티티 모두 id, name 필드를 사용하는 것을 볼 수 있다.
id, name 필드를 부모 클래스로 뽑아내고 @MappedSuperClass 애노테이션을 사용하여 중복을 제거해보자.
@MappedSuperclass
public abstract class BaseEntity {
@Id @GeneratedValue
private Long id;
private String name;
}
@Entity
public class Student extends BaseEntity{
private String grade;
}
@Entity
public class Teacher extends BaseEntity {
private String subject;
}
공통 속성들로 부모 클래스를 만들고, @MappedSuperClass 애노테이션을 적용하였지만, DB 테이블 구조는 그대로인 것을 알 수 있다.
참고로 @MappedSuperClass를 적용한 클래스는 단독으로 생성해서 쓰일 일이 없기 때문에 abstract 키워드를 사용하여 추상 클래스로 만드는 것을 권장한다.
'데이터베이스 > JPA' 카테고리의 다른 글
[JPA] 값 타입 컬렉션 : @ElementCollection, @CollectionTable (0) | 2021.03.24 |
---|---|
[JPA] Cascade(영속성 전이), OrphanRemoval(고아객체 제거) (0) | 2021.03.17 |
JPA JPQL 페치 조인(fetch join) (0) | 2021.02.21 |
JPA 임베디드 타입( Embedded Type, 복합 값 타입) : @Embedded, @Embeddable, @AttributeOverride, @AttributeOverrides (0) | 2021.02.20 |
JPA 지연로딩을 사용해야하는 이유, 지연로딩(Lazy)과 즉시로딩(Eager) (0) | 2021.02.12 |
댓글