반응형
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다.
Mapped Superclass 매핑 정보 상속
- 테이블과 매핑하지 않고 부모 클래스를 상속받는 자식 클래스에게 매핑 정보만 제공한다.
- 추상 클래스와 비슷하며 @MappedSuperclass는 실제 테이블과 매핑 되지 않는다.
- 객체에 공통 속성이 존재하는 필드를 객체 입장에서 속성만 상속 받아서 사용하고 싶을 때 사용한다. 물론 DB와는 별개이다.
@MappedSuperclass 매핑
BaseEntity.class
@MappedSuperclass
public class BaseEntity {
private String createdBy;
private LocalDateTime createdDate;
private String lastModifiedBy;
private LocalDateTime lastModifiedDate;
...getter/setter 생략
}
BaseEntity 상속
//Member.class
@Entity
public class Member extends BaseEntity{ // BaseEntity 상속
...생략
//Team.class
@Entity
public class Team extends BaseEntity{ // BaseEntity 상속
실행 클래스
...생략
Member member = new Member();
member.setUsername("userLee");
member.setCreatedBy("Lee");
member.setCreatedDate(LocalDateTime.now());
em.persist(member);
em.flush();
em.clear();
tx.commit();
...생략
// 출력 로그
Hibernate:
create table Team (
TEAM_ID bigint not null,
createdBy varchar(255),
createdDate timestamp,
lastModifiedBy varchar(255),
lastModifiedDate timestamp,
name varchar(255),
primary key (TEAM_ID)
)
Hibernate:
create table Member (
MEMBER_ID bigint not null,
createdBy varchar(255),
createdDate timestamp,
lastModifiedBy varchar(255),
lastModifiedDate timestamp,
USERNAME varchar(255),
TEAM_ID bigint,
primary key (MEMBER_ID)
)
Member와 Team 테이블에 BaseEntity의 필드가 추가되어 생성된 걸 볼 수 있다.
- @Column
// BaseEntity.class 중 일부
@Column(name = "INSERT_MEMBER")
private String createdBy;
// 출력 로그
Hibernate:
create table Member (
MEMBER_ID bigint not null,
INSERT_MEMBER varchar(255), // 컬럼 이름 변경
createdDate timestamp,
lastModifiedBy varchar(255),
lastModifiedDate timestamp,
USERNAME varchar(255),
TEAM_ID bigint,
primary key (MEMBER_ID)
)
Hibernate:
create table Team (
TEAM_ID bigint not null,
INSERT_MEMBER varchar(255), // 컬럼 이름 변경
createdDate timestamp,
lastModifiedBy varchar(255),
lastModifiedDate timestamp,
name varchar(255),
primary key (TEAM_ID)
)
@MappedSuperclass 특징
- 상속 관계 매핑이 되지 않고, 엔티티가 생성되지 않고, 테이블과 매핑하지 않는다.
- 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공한다.
- @MappedSuperclass 애노테이션이 붙은 객체를 이용해 조회, 검색이 불가능하다.
em.find(BaseEntity) 불가 - 직접 생성해서 사용할 일이 없으므로 추상 클래스를 권장한다.
@Entity 클래스는 엔티티나 @MappedSuperclass로 지정한 클래스만 상속 가능하다.
반응형