複合 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;
}
誰かがいくつかの改善/追加を行っている場合は、それらを読みたいです.
これはこれを解決するための私の最初の試みであるため、これはおそらく最もクリーンな解決策ではありません。そして、これは私の最初の投稿です。そのため、経験不足のためにフォーマットが少し不安定になる可能性があります:-)