위의 다이어그램을 @IdClass를 이용하여 작성해보면 다음과 같다.
// 부모
@Entity
public class Parent {
@Id
@Column(name = "PARENT_ID")
private String id;
private String name;
}
// 자식
@Entity
@IdClass(ChildId.class)
public class Child {
@Id
@Column(name = "CHILD_ID")
private String id;
@Id
@ManyToOne
@JoinColumn(name = "PARENT_ID")
private Parent parent;
}
// 자식 ID
public class ChildId implements Serializable {
private String id;
private String parent;
// equals, hashCode
}
// 손자
@Entity
@IdClass(GrandChildId.class)
public class GrandChild {
@Id
@Column(name = "GRANDCHILD_ID")
private String id;
@Id
@ManyToOne
@JoinColumns({
@JoinColumn(name = "PARENT_ID, referencedColumnName = "PARENT_ID")
@JoinColumn(name = "CHILD_ID, referencedColumnName = "CHILD_ID")
})
private Child child;
}
// 손자 ID
public class GrandChildId implements Serializable {
private String id;
private ChildId child;
// equals, hashCode
}
위와 같이 작성한 후 다음과 같이 작성하면 저장이 잘 됨을 알 수 있다.
Parent parent = new Parent();
parent.setName("PARENT_NAME#1");
parent.setId("PARENT#1");
em.persist(parent);
Child child = new Child();
child.setId("CHILD#1");
child.setParent(parent);
em.persist(child);
GrandChild grandChild = new GrandChild();
grandChild.setId("GRANDCHILD#1");
grandChild.setChild(child);
em.persist(grandChild);