728x90
반응형
[JPA] @MappedSuperclass(공통 매핑 정보 해결)
테이블을 설계하다 보면 공통적으로 사용 되는 컬럼들이 있습니다.
생성시간(createDate
), 수정시간(lastModifiedDate
) 같은것을 예를 들수 있겠군요. ㅎㅎ
엔티티를 생성할때마다 공통 속성들을 생성하면 너무 귀찮겠죠?
(개발자들은 귀찮은 것은 절대 못 참아요. !!😡)
@MappedSuperclass 등장
그래서 JPA
에서는 이렇게 공통적으로 사용하는 컬럼을 하나의 클래스에서 관리할 수 있도록 해줍니다.@MappedSuperclass
를 사용하면 말이죠!
@MappedSuperclass
public abstract class BaseTimeEntity {
private LocalDateTime createDate;
private LocalDateTime lastModifiedDate;
}
public Member extends BaseTimeEntity {
//..//
}
이런식으로 사용 하면 됩니다.
정리
- 공통 매핑 정보가 필요할 때 사용
- e.g)
id
,name
,createTime
,modifiedTime
…
- e.g)
- 상속관계 매핑 🙅♀️
- 엔티티 🙅♀️
- 테이블과 매핑 🙅♀️
- 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공
- 조회, 검색 불가
- (
em.find(BaseEntity.class, id)
불가) - 부모 클래스임에도 불구하고 조회가 안된다는 의미 입니다.
- (
- 직접 생성해서 사용할 일이 없으므로 추상 클래스(
abstract
) 권장
스프링에서 자동화 하기
BaseTimeEntity
@MappedSuperclas
를 사용하여 공통 속성 클래스를 생성합니다.JPA
에서 제공하는 기능인 Audit
를 사용합니다.
간략하게 설명하자면 Spring Data JPA
에서 시간에 대해서 자동으로 값을 넣어주는 기능입니다.
(@EntityListeners(AuditingEntityListener.class)
를 설정하면 됩니다.!)
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {
@CreatedDate
private LocalDateTime createDate;
@LastModifiedDate
private LocalDateTime lastModifiedDate;
}
Order
BaseTimeEntity
를 상속 받는 Entity
를 생성 합니다.
@Entity @Getter
@Table(name = "orders")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Order extends BaseTimeEntity {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "order_id")
private Long id;
// .. //
}
BackendApplication
JPA
에서 제공하는 기능인 Audit
를 사용하기 위해
스프링 메인 클래스에 @EnableJpaAuditing
를 추가합니다.
@EnableJpaAuditing
public class BackendApplication {
public static void main(String[] args) {
SpringApplication.run(BackendApplication.class, args);
}
}
정리
- 테이블과 관계 없고, 단순히
Entity
가 공통으로 사용하는 매핑 정보를 모으는 역할입니다. - 주로 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통으로 적용하는 정보를 모을 때 사용합니다.
✅ 참고: @Entity
클래스는 Entity
나 @MappedSuperclass
로 지정한 클래스만 상속 가능 합니다.
728x90
반응형
'0+ 스프링 > 0 + 스프링 ORM(JPA)' 카테고리의 다른 글
[JPA] JPA가 Entity를 판별하는 방법과 save()의 비밀(entityInformation.isNew(entity)) (0) | 2023.02.22 |
---|---|
[JPA] 하이버네이트 프록시와 지연로딩(Lazy), 즉시로딩(Eager) (0) | 2023.02.22 |
[JPA] 상속관계 매핑 (0) | 2023.02.20 |
[JPA] 연관관계 매핑(@ManyToOne, @OneToMany, @OneToOne, @ManyToMany) (0) | 2023.02.20 |
[JPA] 연관관계 매핑 개념(패러다임 불일치 해결) (0) | 2023.02.18 |