슈퍼타입 서브타입 관계
- 각각의 테이블로 변환: 조인 전략
- 통합 테이블로 변환: 단일 테이블 전략
- 서브타입 테이블로 변환: 구현 클래스마다 테이블 전략
엔티티 각각을 모두 테이블로 만들고 자식 테이블이 부모 테이블의 기본 키를 받아서 기본 키 + 외래 키로 사용하는 전략
테이블을 하나만 사용하고 구분 컬럼(DTYPE)으로 어떤 자식 데이터가 저장되었는지 구분
자식 엔티티마다 테이블을 만들고 자식 테이블 각각에 필요한 컬럼이 모두 있음
- 식별 관계: 부모 테이블의 기본 키를 내려받아서 자식 테이블의 기본 키 + 외래 키로 사용하는 관계
- 비식별 관계: 부모 테이블의 기본 키를 받아서 자식 테이블의 외래 키로만 사용하는 관계
- 필수적 비식별 관계: 외래 키에 NULL 허용X
- 선택적 비식별 관계: 외래 키에 NULL 허용
@@Entity
@IdClass(ParentId.class)
public class Parent {
@Id
@Column(name = "PARENT_ID1")
private String id1;
@Id
@Column(name = "PARENT_ID2")
private String id2;
private String name;
...
}
public class ParentId implements Serializable {
private String id1;
private String 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() {...}
}
@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 구현
...
}
추천하는 방법은 비식별 관계를 사용하고 기본 키는 Long 타입의 대리 키 사용
조인 컬럼(@JoinColumn) 사용
조인 테이블(@JoinTable) 사용
따라서 기본은 조인 컬럼을 사용하고 필요하다고 판단되면 조인 테이블 사용
// 부모
@Entity
public class Parent {
@Id @GeneratedValue
@Column(name = "PARENT_ID")
private Long id;
private String name;
@OneToOne
@JoinTable(name = "PARENT_CHILD",
joinColuns = @JoinColumn(name = "PARENT_ID"),
inverseColumns = @JoinColumn(name = "CHILD_ID")
)
private Child child;
...
}
// 자식
@Entity
public class Child {
@Id @GeneratedValue
@Column(name = "CHILD_ID")
private Long id;
private String name;
...
}
// 부모
@Entity
public class Parent {
@Id @GeneratedValue
@Column(name = "PARENT_ID")
private Long id;
private String name;
@OneToMany
@JoinTable(name = "PARENT_CHILD",
joinColuns = @JoinColumn(name = "PARENT_ID"),
inverseColumns = @JoinColumn(name = "CHILD_ID")
)
private Child child;
...
}
// 자식
@Entity
public class Child {
@Id @GeneratedValue
@Column(name = "CHILD_ID")
private Long id;
private String name;
...
}
// 부모
@Entity
public class Parent {
@Id @GeneratedValue
@Column(name = "PARENT_ID")
private Long id;
private String name;
@OneToMany
private Child child;
...
}
// 자식
@Entity
public class Child {
@Id @GeneratedValue
@Column(name = "CHILD_ID")
private Long id;
private String name;
@ManyToOne (optional = false)
@JoinTable(name = "PARENT_CHILD",
joinColuns = @JoinColumn(name = "CHILD_ID"),
inverseColumns = @JoinColumn(name = "PARENT_ID")
)
private Parent parent;
...
}
// 부모
@Entity
public class Parent {
@Id @GeneratedValue
@Column(name = "PARENT_ID")
private Long id;
private String name;
@ManyToMany
@JoinTable(name = "PARENT_CHILD",
joinColuns = @JoinColumn(name = "PARENT_ID"),
inverseColumns = @JoinColumn(name = "CHILD_ID")
)
private List<Child> child = new ArrayList<Child>();
...
}
// 자식
@Entity
public class Child {
@Id @GeneratedValue
@Column(name = "CHILD_ID")
private Long id;
private String name;
...
}