我正在尝试使用复合ID在单个表中映射父子关系。 但是我遇到了一些困难,似乎无法通过谷歌和Google找到合适的答案。计算器。
现在,在写这篇文章时,我想出来了!我发布的这个解决方案和其他可能遇到同样“挑战”的人一样。
注意:我遗漏了所有的getter和setter,以保持一点紧凑。
首先,表PlanDBtasktree
原样(大大简化):
taskID mainTaskID planID
---------------------------------
1 NULL 42
2 1 42
3 1 42
4 2 42
5 2 42
1 NULL 102
所以结构将是:
1-42
2-42
4-42
5-42
3-42
1-102
taskID& planID写为@EmbeddedId
:
@Embeddable
public class PlanDBtasktreeID implements Serializable {
@Basic( optional = false )
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name="planID")
private PlanDBinstance planID;
@Basic( optional = false )
@Column(name = "taskID")
private Long taskID;
// equals & hashcode...
}
班级PlanDBtasktree
中的映射:
@EmbeddedId
private PlanDBtasktreeID tId;
现在我想在同一个类中检索父/子关系,因为它是一个递归树。
列mainTaskID
是“父”引用。知道了这一点,我创建了另一个Embeddable
对象:
@Embeddable
public class PlanDBmaintreeID implements Serializable {
@Basic( optional = false )
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name="planID", insertable = false, updatable = false)
private PlanDBinstance planID;
@Basic( optional = false )
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumns({
@JoinColumn(name = "planID", insertable = false, updatable = false),
@JoinColumn(name = "maintaskID", insertable = false, updatable = false)
})
private PlanDBtasktree maintaskID;
}
PlanDBtasktree
类中的映射:
@Embedded
private PlanDBmaintreeID mtId;
最后,从PlanDBtasktree
检索孩子:
@OneToMany(mappedBy = "mtId", cascade = CascadeType.ALL)
private List<PlanDBtasktree> PlanDBtasktree_children_List;
PlanDBtasktree
类的完整映射:
public class PlanDBtasktree {
@EmbeddedId
private PlanDBtasktreeID tId;
@Embedded
private PlanDBmaintreeID mtId;
@OneToMany(mappedBy = "mtId", cascade = CascadeType.ALL)
private List<PlanDBtasktree> PlanDBtasktree_children_List;
}
如果某人有一些改进/补充,我很乐意阅读它们。
这是我第一次尝试解决这个问题,所以这可能不是最干净的解决方案。 这是我在这里发布的第一篇文章,因此缺乏经验,格式可能会有点不确定:-)