web/JPA

@MappedSuperclass를 이용한 부모 매핑정보 사용하기

반응형

기존에는 부모의 엔티티에 접근해서 정보를 가져와서 사용했다. 하지만 그러면 너무 비용이 크기 때문에 이를 위해서 부모클래스의 매핑정보만 가지고와서 사용할 수 있는 방법이 있다.

@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 등에 대한 공통 영역 관리를 수월하게 있다.


반응형