我正在尝试在具有复合 ID 的单个表中映射父子关系。但是我遇到了一些困难,似乎无法通过 Google 和 Stackoverflow 找到正确的答案。
现在,在写这篇文章时,我想通了!我将这个解决方案发布给其他可能遇到同样“挑战”的人。
注意:我省略了所有的 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;
}
如果有人有一些改进/补充,我很乐意阅读它们。
这是我第一次尝试解决这个问题,所以这可能不是最干净的解决方案。这是我在这里的第一篇文章,因此由于缺乏经验,格式可能有点不确定:-)