작성
·
421
0
강사님 안녕하세요 !!
@Entity @Getter @Setter
public class EmParent {
@Id
private String id;
private String name;
}
@Entity @Getter @Setter
public class EmChild {
@EmbeddedId
private EmChildId id;
@MapsId("parentId")
@ManyToOne
@JoinColumn(name = "parent_id",foreignKey = @ForeignKey(name = "parent_fk"))
public EmParent parent;
private String name;
@EqualsAndHashCode
@Getter @Setter @Embeddable
public static class EmChildId implements Serializable {
private String parentId;//@MapsId("parentId")와 매핑
@Column(name = "child_id")
private String id;//Child.childId 매핑
}
}
테스트코드
EmParent emParent = new EmParent();
emParent.setName("내장 할아버지");
emParent.setId("A001");
em.persist(emParent);
//복합키 만들기
EmChild.EmChildId id = new EmChild.EmChildId();
id.setId("F001");
id.setId("fake data");
//자식 엔티티 생성
EmChild emChild = new EmChild();
//자식 엔티티에 복합키 주입하기
emChild.setId(id);
//아래 정보를 넣지 않으면 예외가 발생
emChild.setParent(emParent);
emChild.setName("내장 아버지");
em.persist(emChild);
식별 관계에서 @EmbeddedId를 사용할 때
자식 엔티티에 Id 객체인 EmChildId 를 넣어줄 때
EmChildId 클래스의
@Column(name = "child_id")
private String id;//Child.childId 매핑
만 참조를 하고 부모의 pk를 참조하는 private String parentId;에는 어떤 값이 들어가도
의미가 없더라구요
@MapsId("parentId")
@ManyToOne
@JoinColumn(name = "parent_id",foreignKey = @ForeignKey(name = "parent_fk"))
public EmParent parent
여기에 값을 넣어줘야 EmChild 엔티티가 정상 동작합니다.
제가 실수한 부분있는 걸까요 ?
아니면 식별관계일 때 @EmbeddedId는 읽어올때만 상관이 있고 저장할 때에는 상관이 없는 객체인가요?
답변 2
0
안녕하세요. kamser님
도움을 드리고 싶지만 질문 내용만으로는 답변을 드리기 어렵습니다.
실제 동작하는 전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.
구글 드라이브 업로드 방법은 다음을 참고해주세요.
주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요
추가로 다음 내용도 코멘트 부탁드립니다.
1. 문제 영역을 실행할 수 있는 방법
2. 문제가 어떻게 나타나는지에 대한 상세한 설명
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
kamser님, JPA에서 @EmbeddedId를 사용하여 복합키를 매핑할 때, @MapsId 어노테이션을 이용하여 부모 엔티티의 ID 값을 자식 엔티티의 복합키 컴포넌트 중 하나로 매핑합니다. 여기서 @MapsId("parentId")
는 EmChildId
내의 parentId
필드와 @ManyToOne
으로 매핑된 parent
엔티티의 ID를 연결하겠다는 의미입니다.
복합키를 사용하는 자식 엔티티의 경우, 복합키 클래스(EmChildId
) 내의 필드에 직접 값을 설정하는 것보다는, 실제 엔티티 관계를 통해 설정해야 할 때가 많습니다. @MapsId
를 사용해서 부모의 식별자를 자식의 복합키 일부로 사용할 경우, 해당 부모 엔티티를 참조하는 parent
필드에 실제 엔티티를 설정해야 하며, 이 과정에서 자동으로 parentId
필드에 부모의 식별자 값이 설정됩니다.
따라서, 저장 시에 parentId
에 어떤 값이 들어가든 비어 있든 간에, parent
에 실제 엔티티가 설정되어야 하며, 그것이 올바른 식별관계 설정입니다. 실제로 저장할 때는 parent
엔티티에 대한 참조가 중요하고, 조회할 때 EmChildId
를 통한 복합키 참조가 중요합니다.
kamser님의 경우에는 parent
필드에 emParent
엔티티를 설정함으로써 복합키의 parentId
에도 올바른 값이 설정되었을 것이며, 이는 실수가 아닌 JPA의 정상적인 동작입니다. 저장할 때에도 @EmbeddedId
를 사용한 복합키는 중요하며, 올바른 매핑을 통해 식별 관계를 구성해야 합니다.
궁금증이 해소되었길 바라며, 추가적인 질문이 있으시면 언제든지 문의해 주세요.
링크가 잘못 되었네요.
다음 링크를 참고해주세요.
https://bit.ly/3fX6ygx