단일 테이블 전략
@DiscriminatorValue 미지정 시 기본 값인 엔티티 이름을 사용
구현 클래스마다 테이블 전략
@AttributeOverride :부모에게 물려받은 매핑 정보 재정의
@AttributeOverrides : AttributeOverride둘 이상 재정의
특징
- 테이블과 매핑되지 않고 자식 클래스에 엔티티 매핑 정보를 상속 하기 위해 사용
- @MappedSuperclass로 지정한 클래스는 엔티티가 아니므로! em.find() 나 JPQL 에서 사용 할 수 없다.
- 데이터베이스 테이블 구조가 바뀐게 아님! 객체에서만 상속모델을 따랐을 뿐!
- 이 클래스를 직접 생성 할 일은 거의 없으므로 추상 클래스로 만드는걸 권장
Member 테이블 만들 시 id,와 name을 MEMBER_ID ,MEMBER_NAME 으로 생성
식별 관계
부모 테이블의 PARENT_ID 를 받아 자식 테이블의 PK+FK 로 사용
비식별 관계
필수적 비식별 관계
최근에는 비식별관계를 주로 사용하고 꼭 필요한 곳에만 식별 관계를 사용하는 추세
복합 키 : 비식별 관계 매핑
둘 이상의 식별자를 이용하려면 별도의 식별자 클래스를 만들어야 한다. (6장에 있었던 내용)
@IdClass (예시로 알아보겠습니다.)
[복합 키 테이블]
[부모 클래스]
@Entity
@IdClass(ParentId.class)
public class Parent {
@Id
@Column(name = "PARENT_ID1")
private String id1; //ParentId.id1 과 연결
@Id
@Column(name = "PARENT_ID2")
private String id2; //ParentId.id2 와 연결
private String name;
...
}
[식별자 클래스]
public class ParentId implements Serializable {
private String id1; //Parent.id1 매핑
private String id2; //Parent.id2 매핑
public ParentId(){}
public ParentId(String id1, String id2) {
this.id1 = id1;
this.id2 = id2;
}
@Override
public boolean equals(Object o) {...}
@Override
public int hashCode() {...}
}
식별자 클래스의 조건
복합키를 사용하는 엔티티 저장 예시
Parent parent = new Parent();
parent.setId1("myId1");
parent.setId2("myId2");
parent.setName("SOONPARENT");
em.persist(parent);
식별자 클래스인 ParnetId의 경우 영속성 컨텍스트에 엔티티를 등록하기 직전에 내부에서 생성 한 뒤 컨텍스트의 키로 사용
복합키 조회 예시
ParentId parentId = new ParentId("myId1", "myId2");
Parent parent = em.find(parent.class, parentId);
@EmbeddedId
@IdClass 가 데이터베이스에 맞춘 방법이라면 @EmbeddedId 는 좀 더 객체지향적인 방법 이다.
@Entity
public class Parent {
@EmbeddedId
private ParentId id; //식별자 클래스 직접 지정
private String name;
...
}
@Embeddable
public class ParentId implements Serializable {
@Column(name = "PARENT_ID1")
private String id1;
@Column(name = "PARENT_ID2")
private String id2;
//equals and hashcode 구현
...
}
@EmbeddedId 적용한 식별자 클래스 조건
복합키: 식별 관계 매핑
식별, 비식별 관계의 장단점