同一类中的嵌入式父/子关系

时间:2013-02-05 09:38:39

标签: java hibernate parent-child composite-key composite-primary-key

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

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

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

0 个答案:

没有答案