개발 도서 읽기/자바 ORM 표준 JPA 프로그래밍

[7장]7.3.3~7.3.5 복합 키: 식별 관계 매핑 / 일대일 식별관계

nnhhmm 2024. 11. 19. 18:58

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;
    ...
}