반응형
기존에는 부모의 엔티티에 접근해서 정보를 가져와서 사용했다. 하지만 그러면 너무 비용이 크기 때문에 이를 위해서 부모클래스의 매핑정보만 가지고와서 사용할 수 있는 방법이 있다.
@MappedSuperClass 어노테이션을 사용하면 부모 엔티티 접근 없이 부모 클래스의 매핑정보를 사용할 수 있다.
예를들어 선생님과 학생을 담당하는 클래스에서 id와 name은 공통 속성이다. 이런 고유 속성을 부여해주는 부모클래스를 만들고 이를 상속받은 Student와 Teacher 클래스를 만들어보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | /** * springboottest * * @author wedul * @since 03/11/2018 **/ @MappedSuperclass public abstract class CommonEntity { @Id @GeneratedValue private Long id; private String name; } /** * springboottest * * @author wedul * @since 03/11/2018 **/ @Entity public class Student extends CommonEntity { // ID 상속 // NAME 상속 private String locker; } /** * springboottest * * @author wedul * @since 03/11/2018 **/ @Entity public class Teacher extends CommonEntity { // ID 상속 // NAME 상속 private String address; } | cs |
쉽게말해서 저번에 공부 했을때는 무조건 자식테이블이 부모테이블의 테이블과 조인을 해야하기 때문에 번거로웠으나 단순하게 자신의 매핑정보와 부모의 매핑정보를 사용해서 새로운 동작을 할 수 있게 해준다.
부모의 내용을 별도로 재정의해서 사용하고 싶은 경우에는 @AttributeOverride를 사용하여 재정의 한다. 여러개를 한번에 정의하기 위해서는 @AttributeOverrides를 사용한다.
1 2 3 4 5 6 7 8 9 10 11 | @Entity @AttributeOverride(name = "id", column = @Column(name = "TEACHER_ID")) public class Teacher extends CommonEntity { @Entity @AttributeOverrides({ @AttributeOverride(name="id", column = @Column(name = "STUDENT_ID")), @AttributeOverride(name="name", column = @Column(name = "STUDENT_NAME")) }) public class Student extends CommonEntity { | cs |
@MappedSuperClass는 테이블과 매핑 되지 않고 자식 클래스에 엔티티의 매핑정보를 상속하기 위해 사용 되기 때문에 정식 엔티티가 아니다. 그래서 find()나 JPQL등의 메소드를 사용할 수 없다.
이를 이용하면 createTime, updateTime 등에 대한 공통 영역 관리를 수월하게 할 수 있다.
반응형
'web > JPA' 카테고리의 다른 글
QueryDsl에서 delete limit 문법을 사용할 수 없는 이유 (1) | 2021.06.11 |
---|---|
스프링 부트에서 사용하는 JPA 기능 정리 (3) | 2018.11.04 |
JPA 상속관계 매핑 전략 (0) | 2018.10.31 |
JPA 관계 유형별 엔티티 설정 방법 (0) | 2018.10.31 |
연관관계 매핑 (다대일 - 양방향) (0) | 2018.10.26 |