일단 이거는 전에 배웠던 상속관계 매핑과는 별로 관계가 깊지 않다.
이거는 뭐냐면,
그러니까 좀 완전 다른?
다른 테이블인데,
객체상에서만 속성만 상속 받아서 쓰고 싶은 경우.
뭐 이런 경우..
Member Seller 완전 다른 테이블이지만, 객체상에서는 상속 받아서 쓰고 싶다.
왜냐하면 저렇게 id나 name같은 거 중복 있으면 저런 게 여러 개 있으면 귀찮으니까.
그러니까, 뭐 상속받는다 그런 거 보다는,
공통적인 것을 사용하고 싶을 때.
공통적인 매핑 정보가 있을 때 사용한다.
꽤 자주 사용하는 모양이다.
뭐 하긴 게임오브젝트로 생각하면 유용할 것 같기는 하다.
코드
@MappedSuperclass
public abstract class BaseEntity {
private String createdBy;
private LocalDateTime createdDate;
private String lastModifiedBy;
private LocalDateTime lastModifiedDate;
}
@MappedSuperclass 해서 매핑정보만 주는 클래스라는 걸 명시해준다.
@Entity
public class Users extends BaseEntity{
@Id
@GeneratedValue
private Long id;
private String name;
}
상속 받아서 쓰면 된다. (users로 한 건 user가 쿼리문에서 뭔가 의미가 있는지 저 쪽에서 문법에러가 나서 users로 했다.)
@Entity
public class Seller extends BaseEntity{
@Id
@GeneratedValue
private Long id;
private String shopName;
}
이렇게 하면 테이블이
Hibernate:
create table Users (
createdDate timestamp(6),
id bigint not null,
lastModifiedDate timestamp(6),
createdBy varchar(255),
lastModifiedBy varchar(255),
name varchar(255),
primary key (id)
)
Hibernate:
create table Seller (
createdDate timestamp(6),
id bigint not null,
lastModifiedDate timestamp(6),
createdBy varchar(255),
lastModifiedBy varchar(255),
shopName varchar(255),
primary key (id)
)
이렇게 자동으로 만들어 진다.
참고로,
얘는 엔티티가 아니다. 즉, 테이블이랑 매핑된 애가 아니다. 그래서 가상 클래스로 하는 게 좋다. (당연히 ddl.auto에 의해 자동생성도 돼지 않는다.)
그냥 공통으로 사용할 매핑정보만 모으는 용도이다.
테이블이 없으므로, 저 BaseEntity로 조회등도 불가능 하다. em.find(BaseEntity)한다든지.
직접 생성할 일이 없어서, 추상클래스로 하는 게 좋다.
@Entity 클래스는, @Entity나 @MappedSuperclass로 지정한 클래스만 상속 가능 하다.
'JPA > JPA 기본' 카테고리의 다른 글
28. 즉시로딩, 지연로딩 (0) | 2023.10.28 |
---|---|
27. 프록시 (0) | 2023.10.27 |
24. 상속관계 매핑 (0) | 2023.10.26 |
23. 실전3 다양한 연관관계 매핑 (0) | 2023.10.25 |
22. N : M 다대다 연관관계 (0) | 2023.10.25 |