실습은
ex1-hello-jpa
로 진행되었습니다.
DB:.../~/test
➡️
@Inheritance(strategy=InheritanceType.XXX)
XXX 자리에JOINED
,SINGLE_TABLE
,TABLE_PER_CLASS
중 하나를 넣으면 된다.
또 다른 주요 어노테이션
@DiscriminatorColumn(name="DTYPE")
@DiscriminatorValue("XXX")
// JpaMain.java
try {
Movie movie = new Movie();
movie.setDirector("A");
movie.setActor("B");
movie.setName("불한당");
movie.setPrice(10000);
em.persist(movie);
em.flush();
em.clear();
Movie findMovie = em.find(Movie.class, movie.getId());
System.out.println("findMovie = " + findMovie);
tx.commit();
} catch (Exception e) {
: 논리 모델을 한 테이블로 합쳐버림
📌 Item.java의
@Inheritance(strategy = InheritanceType.JOIN)
➡️@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
로 변경하기만 하면 됨
📌 Item.java의
@Inheritance(strategy = InheritanceType.XXX)
➡️@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
로 변경하기만 하면 됨
@MappedSuperclass
: 아래와 같이 공통 매핑 정보가 필요할 때 사용
// BaseEntity.java
package hellojpa;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;
@MappedSuperclass // 매핑 정보만 받는 부모 클래스
public class BaseEntity {
private String createBy;
private LocalDateTime createDate;
private String lastModified;
private LocalDateTime lastModifiedDate;
public String getCreateBy() {
return createBy;
}
public void setCreateBy(String createBy) {
this.createBy = createBy;
}
public LocalDateTime getCreateDate() {
return createDate;
}
public void setCreateDate(LocalDateTime createDate) {
this.createDate = createDate;
}
public String getLastModified() {
return lastModified;
}
public void setLastModified(String lastModified) {
this.lastModified = lastModified;
}
public LocalDateTime getLastModifiedDate() {
return lastModifiedDate;
}
public void setLastModifiedDate(LocalDateTime lastModifiedDate) {
this.lastModifiedDate = lastModifiedDate;
}
}
// Member.java
public class Member extends BaseEntity {
// Team.java
public class Team extends BaseEntity {
// JpaMain.java
try {
Member member = new Member();
member.setUsername("userA");
member.setCreateBy("Yoon");
member.setCreateDate(LocalDateTime.now());
em.persist(member);
em.flush();
em.clear();
tx.commit();
} catch (Exception e) {
마찬가지로 Team에도 생성됨
em.find(BaseEntity)
불가능)등록일
, 수정일
, 등록자
, 수정자
같은 전체 엔티티에서 공통으로 적용하는 정보를 모을 때 사용📌 @Entity
(상속 관계 매핑할 때 사용) 클래스는 엔티티나 @MappedSuperclass
(속성만 상속할 때 사용)로 지정한 클래스만 상속 가능
해당 실습은
jpabook/jpashop
으로 진행하였습니다.
DB: /~/jpashop
👩🏻💻 추가 요구사항
- (상속 관계 매핑) 상품의 종류는 음반, 도서, 영화. 그리고 이후 확장 가능.
- (MappedSuperclass) 모든 데이터는 등록일, 수정일을 가짐.
// Item.java
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn
public abstract class Item extends BaseEntity {
// Item.java
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn
public abstract class Item extends BaseEntity {
하지만 우린 싱글테이블 속성을 사용할 것