7.3.3
@IdClass와 식별 관계
// 부모
@Entity
public class Parent {
@Id @Column(name = "PARENT_ID")
private String id;
private String name;
...
}
// 자식
@Entity
@IdClass(ChildId.class)
public class Child {
@Id
@ManyToOne
@JoinColumn (name = "PARENT_ID")
public Parent parent;
@Id @Column (name = "CHILD_ID")
private String cildId;
private String name;
...
}
// 자식 ID
public class CildId implements Serializable {
private String parent; //Child.parent 매핑
private String childId; //Child.childId 매핑
//equals, hashCode
...
}
// 손자
@Entity
@IdClass(GrandCildId.class)
public class GrandChild {
@Id
@ManyToOne
@JoinColumns({
@JoinColumn(name = "PARENT_ID"),
@JoinColumn(name = "CHILD_ID")
})
private Child child;
@Id @Column(name = "GRANDCHILD_ID")
private String id;
private String name;
...
}
// 손자 ID
public class GrandChildId implements Serializable {
priate ChildId child; //GrandChild.child 매핑
private String id; //GrandChild.id 매핑
//equals, hashCode
...
}
식별 관계는 기본 키와 외래 키를 같이 매핑해야 한다.
따라서 식별자 매핑인@Id와 연관관계 매핑인 @ManyToOne을 같이 사용하면 된다.
@EmbeddedId와 식별 관계
@EmbeddedId로 식별관계를 구성할때는 @MapsId를 사용해야한다.
// 부모
@Entity
public class Parent {
@Id @Column(name = "PARENT_ID")
private String id;
private String name;
...
}
// 자식
@Entity
public class Child {
@EmbeddedId
private ChildId id;
@MapsId("parentId") // ChildId.parentId 매핑
@ManyToOne
@JoinColumn (name = "PARENT_ID")
public Parent parent;
private String name;
...
}
// 자식 ID
@Embeddable
public class ChildId implements Serializable {
priavate String parentId; // @MapsId("parentId")로 매핑
@Column(name = "CHILD_ID")
private String id;
//equals, hashCode
...
}
// 손자
@Entity
public class GrandChild {
@EmbeddedId
private GrandChild id;
@MapsId("childId") //GrandChildId.childId 매핑
@ManyToOne
@JoinColumns({
@JoinColumn(name = "PARENT_ID"),
@JoinColumn(name = "CHILD_ID")
})
privat Child child;
private String name;
...
}
// 손자 ID
@Embeddable
public class GrandChildId implements Serializable{
private ChildId childId; //MapsId("childId")로 매핑
@Column (name = "GRANDCHILD_ID")
private String id;
//equals, hashCode
...
}
@EmbeddedId는 식별 관계로 사용한 연관관계의 속성에 @MapsId를 사용하면 된다.
7.3.4 비식별 관계로 구현
// 부모
@Entity
public class Parent {
@Id @GeneratedValue
@Column(name = "PARENT_ID")
private Long id;
private String name;
...
}
// 자식
@Entity
public class Child{
@Id @GeneratedValue
@Column (name = "CHILD_ID")
private Long id;
private String name;
@ManyToOne
@JoinColumn (name = "PARENT_ID")
private Parent parent;
...
}
// 손자
@Entity
public class GrandChild {
@Id @GeneratedValude
@Column(name = "GRANDCHILD_ID")
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "CHILD_ID")
private Child child;
...
}
7.3.5 일대일 식별 관계
// 부모
@Entity
public class Board{
@Id @GeneratedValue
@Column (name = "BOARD_ID")
private Long id;
private String title;
@OneToOne(mappedBy = "board")
private VoardDetail boardDetail;
...
}
// 자식
@Entity
public class BoardDetail{
@Id
private Long boardId;
@MasId // BoardDetail.boardId 매핑
@OneToOne
@JoinColumn(name = "BOARD_ID")
private Board board;
private String content;
...
}
'개발 도서 읽기 > 자바 ORM 표준 JPA 프로그래밍' 카테고리의 다른 글
[7장] 7.4~7.5 조인 테이블 / 엔티티 하나에 여러 테이블 매핑 (0) | 2024.11.20 |
---|---|
[7장] 7.3.6 식별, 비식별 관계의 장단점 (1) | 2024.11.19 |
[7장]7.3.1~7.3.2 복합 키 : 비식별 관계 매핑 (0) | 2024.11.19 |
[7장] 7.2 @MappedSuperclass (0) | 2024.11.19 |
[7장] 7.1 상속 관계 매핑 (1) | 2024.11.17 |