728x90
반응형
@MappedSuperclass
- 해당 어노테이션은 공통속성을 만들어서 사용할때 쓴다.
- 테이블과 관계 없고 단순히 공통으로 사용하는 정보를 모으는 역할만한다.
언제쓸까?
예를 들어 대부분 테이블에 다음과 같은 속성이 들어가야된다 해보자
- createBy(생성한사람)
- createTime(생성시간)
- modifiedBy(수정자)
- lastModifiedTime(마지막 수정시간)
그렇다면 JPA 에서 모든 클래스를 전부다 찾아서 넣어줘야 될까?
절대 아니다 MappedSuperclass 로 공통 클래스를 하나 만들고 상속만 해주면된다.
구현
공통 클래스 구현
- @MappedSuperclass 어노테이션을 붙여서 공통클래스를 설정해주었다.
// 해당 어노테이션을 쓰면
// 상속 받은 모든 클래스에 해당 속성만 들어가게 된다.
// 속성을 공통으로 관리 할때 쓴다.
@MappedSuperclass
public abstract class BaseEntity {
// 모든 테이블에 다 들어가야한다.
// 속성만 상속 받아서 쓰고 싶다.
private String createBy;
private LocalDateTime createDate;
private String lastModifiedBy;
private LocalDateTime lastModifiedDate;
}
상속
- BaseEntity 를 상속받았다. 그렇게 되면 Member Table에 공통 속성이 들어가게 된다.
@Entity
public class Member extends BaseEntity {
@Id //PK 설정
@GeneratedValue
@Column(name = "OTO_MEMBER_ID")
private Long id;
// 컬럼이름을 지정해준다.
private String name;
@OneToOne
@JoinColumn(name = "OTO_LOCKER_ID")
private Locker locker;
//JPA 는 기본생성자가 있어야 한다.
public Member() {
}
}
결과
테이블이 생성이 되었다.
Hibernate:
create table Member (
OTO_MEMBER_ID bigint not null,
createBy varchar(255),
createDate timestamp,
lastModifiedBy varchar(255),
lastModifiedDate timestamp,
name varchar(255),
OTO_LOCKER_ID bigint,
primary key (OTO_MEMBER_ID)
)
특징
- 상속관계 맵핑이 아니다 단순히 속성만 사용하는것이다.
- 엔티티가 아니다 그렇기 때문에 테이블과 맵핑이 안된다.
- 상속받는 자식클래스에 매핑 정보만 제공해준다.
- 조회 검색 불가 하다.
em.find(BaseEntity) 는 불가능하다. - 직접생성해서 사용하는 일이 없다 추상클래스로 만들자.
728x90
반응형
'DataBase > JPA' 카테고리의 다른 글
[JPA] Lazy 와 Eager (0) | 2021.08.19 |
---|---|
[JPA] 프록시 (0) | 2021.08.11 |
[JPA] 고급 매핑1: 상속관계 맵핑 (0) | 2021.08.08 |
[JPA] 다양한 연관관계 맵핑 (0) | 2021.08.07 |
[JPA] 연관관계 매핑기초5: 예제 (0) | 2021.08.04 |
댓글