1

複合 ID を持つ単一のテーブル内で親子関係をマップしようとしています。しかし、いくつかの問題があり、Google と Stackoverflow で正しい答えを見つけることができなかったようです。

さて、この記事を書いていて気が付きました!同じ「課題」に遭遇する可能性のある他の人のために、このソリューションを投稿しています。

注:全体を少しコンパクトにするために、すべてのゲッターとセッターを省略しました。

まず、表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