それ自体で構成できるエンティティがあります。
class Group {
// ...
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinTable(
name = "group_group",
joinColumns = @JoinColumn(name = "id"),
inverseJoinColumns = @JoinColumn(name = "parentgroup_id")
)
@OrderColumn
private List<Group> groups = new ArrayList<Group>();
@ManyToOne
private Group parentGroup;
public List<Group> getGroups() {
return groups;
}
public Group getGroup() {
return parentGroup;
}
}
グループを作成し、2 つの子グループを追加できます。
Group parent = new Group();
Group child1 = new Group();
Group child2 = new Group();
parent.getGroups().add(child1);
parent.getGroups().add(child2);
parent = groupRepository.save(parent);
// parent.getGroups().get(0).getId() == child1.getId()
// parent.getGroups().get(1).getId() == child2.getId()
しかし、これは偶然のようです。順序を更新することができ (例: Collections.sort を使用)、結合テーブルの行が正しく更新されます。
親グループをどのようにロードするかは問題ではありません。子グループは常に作成順にあります。実行された SQL クエリは次のとおりです。
SELECT t1.ID, t1.PARENTGROUP_ID FROM GROUP t0, GROUP t1 WHERE ((t1.PARENTGROUP_ID = ?) AND (t0.ID = t1.PARENTGROUP_ID))
間違っていると思われる ORDER BY はありません。EclipseLinkにそれを追加するよう説得するにはどうすればよいですか?