1

我正在尝试在具有复合 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;
}

如果有人有一些改进/补充,我很乐意阅读它们。

这是我第一次尝试解决这个问题,所以这可能不是最干净的解决方案。这是我在这里的第一篇文章,因此由于缺乏经验,格式可能有点不确定:-)

4

0 回答 0