9
votes

hibernate @manytomany bidirectionnelle oriente

J'ai une question que je pense devoir être jolie mais je ne trouve pas de réponse.

J'ai 2 objets: groupe et utilisateur. Mes cours ressemblent à ceci comme suit: xxx

Maintenant, lorsque j'essaie d'obtenir un utilisateur de la base de données, il apporte tous ses groupes et tous les groupes apportent tous ses utilisateurs et ainsi de suite. Enfin, je reçois une exception Stackoverflow.

Comment puis-je résoudre ce problème et avoir mon association bidirectionnelle et la possibilité d'atteindre les objets dans les listes?


0 commentaires

3 Réponses :


10
votes

Obtenez-vous le même problème si vous faites l'un des côtés de votre association bidirectionnelle le possédant le côté de l'association à l'aide de l'attribut mappé (que vous devez utiliser quand même )? Comme ceci: xxx

update: Je ne trouve aucune preuve que l'utilisation de désireuse extraire des deux côtés d'une association bidirectionnelle est interdite et AFAIK, il n'y a aucune mention d'une telle restriction dans la documentation hibernate et / ou la spécification JPA.

En réalité, selon Ce commentaire de Emmanuel Bernard à un numéro (d'une manière similaire):

paresseux ou désireux doit être orthogonal à une émission de boucle infinie dans le codeBase. Hibernate sait comment gérer les graphiques cycliques

Pour moi, ce qui précède est assez clair, Hibernate devrait pouvoir gérer votre cartographie (comme je l'ai mentionné dans un commentaire) et je serais tenté de considérer tout comportement contradictoire en tant que bogue.

Si vous pouvez fournir un cas de test permettant de reproduire le problème , ma suggestion serait d'ouvrir un problème.


2 commentaires

Oui. La même chose se passe. Je peux comprendre que cela a du sens B / C Hibernate doit apporter tous les objets de liste pour chaque liste et c'est une boucle infinie. Ma question est de savoir s'il est possible de limiter la profondeur que Hibernate apporte des objets (quelque chose comme Fetch_max_Depth mais pour plusieurs à plusieurs).


@Rafa En fait, je m'attendrais à ce que Hibernate détecte le cycle et à faire la chose appropriée (mais je n'ai pas pris le temps de tester cela). D'autre part, je ne peux pas dire que ceci charger avec impatience les deux côtés d'un grand nombre à plusieurs ressemblent à une bonne idée.



0
votes

Hibernate fonctionne bien quand il essaie d'extraire tout ce dont il a besoin. Les objets de modélisation doivent prendre en compte l'hibernation afin que les boucles et les exceptions de StackoverFlow ne se produisent pas.

Qu'est-ce que j'ai fait, c'est retirer un côté de la relation. Vous pouvez décider si vous souhaitez supprimer ce côté ou pour le laisser et définir l'autre côté en tant que propriétaire. Vous aurez également besoin de supprimer la récupération désireuse de ce côté.

Ce serait bien que l'hibernation puisse donner un mécanisme pour définir la profondeur de la récupération dans de nombreuses relations à plusieurs.


0 commentaires

0
votes

Vous voudrez peut-être définir la propriété "hibernate.max_fetch_depth" à quelque chose comme 3 pour limiter la récupération désireuse.


0 commentaires