Vous pouvez gérer cela dans le modèle de domaine en rendant la relation bidirectionnelle et en écrivant une méthode récursive pour parcourir l'arborescence. L'un des avantages de ceci est qu'il s'occupera des enfants à n'importe quel niveau.
Cela ressemblerait à quelque chose comme ci-dessous, puis pour toute instance que vous pouvez faire :
SomeEntity e = //;
e.getChildren(); //only direct children
e.getAllChildren(); //all children
Entité :
@Entity
@Table(name = "some_entity")
public final class SomeEntity {
@Column(nullable = false, unique = true, length = 20)
private String externalId;
@Column(nullable = false, length = 50)
private String name;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "parentId", nullable = true)
private SomeEntity parent;
@OneToMany(mappedBy = "parent")
private List<SomeEntity> children; //or Set<>
//returns direct children
public List<SomeEntity> getChildren(){
return children;
}
//returns all children to any level
public List<SomeEntity> getAllChildren(){
getAllChildren(this);
}
//recursive function to walk the tree
private List<SomeEntity> getAllChildren(SomeEntity parent){
List<SomeEntity> allChidren = new ArrayList<>();
for(SomeEntity child : children){
allChildren.add(child);
allChildren.addAll(getAllChildren(child);
}
return allChildren;
}
}