Comment remplir une table de fermeture en utilisant JPA?

J'essaie de modéliser une hiérarchie d'objects (en fait, des groupes de domaines) dans une database. J'ai décidé d'utiliser une table de fermeture, de sorte que je puisse get une grande flexibilité dans l'interrogation de la hiérarchie. Fondamentalement, mon schéma ressemble à ceci:

CREATE TABLE group ( id INT -- primary key ... -- other fields here ) CREATE TABLE groupHierarchy ( idAncestor INT, idGroup INT, hierarchyLevel INT ) 

Donc, quand un groupe avec un id de 1 contient un groupe avec un id de 2, qui à son tour contient un groupe avec un id de 3, je devrai avoir les lignes suivantes dans la table groupHierarchy.

 idAncestor idGroup hierarchyLevel 1 1 0 2 2 0 3 3 0 1 2 1 2 3 1 1 3 2 

Je suis également OK avec ne pas avoir les lignes avec les hierarchyLevels de 0 (auto-reference).

Maintenant je voudrais avoir une entité JPA qui serait mappée à la table de groupe. Ma question est – ce qui serait un bon moyen de gérer la table groupHierarchy?

Ce que j'ai déjà considéré est:

1) Avoir la hiérarchie de groupe mappée comme une collection d'éléments, comme:

 @ElementCollection @JoinTable(name = "groupHierarchy") @MapKeyJoinColumn(name = "idAncestor") @Column(name = "hierarchyLevel") Map<Group, Integer> ancestors; 

Cela nécessiterait de manipuler la hiérarchie entièrement dans l'application, et j'ai peur que cela devienne très complexe.

2) Rendre l'application non avertie de la colonne hierarchyLevel et la gérer dans la database en utilisant un sortinggger (lorsqu'un logging est ajouté, vérifiez si le parent a déjà des ancêtres et si oui, ajoutez les autres lignes requirejses. 0 serait utile). Il me semble que le triggersur de database serait plus simple, mais je ne suis pas sûr que ce serait bon pour la lisibilité globale.

Quelqu'un peut-il suggérer d'autres options? Ou peut-être indiquer les avantages ou les inconvénients des solutions que j'ai mentionnées?

Puis-je vous suggérer d'utiliser JpaTreeDao ? Je pense que c'est complet et très bien documenté. Je vais essayer de porter le code des tables de fermeture à une implémentation groovy …