hibernate @ManyToMany bidirectionnel chargement agressif
J'ai une question qui je pense, devrait être assez commun, mais je ne peux pas trouver une réponse.
J'ai 2 objets: le Groupe et l'Utilisateur. Mes cours ressembler à quelque chose comme ceci:
class Group
{
@ManyToMany(fetch = FetchType.EAGER)
List<User> users;
}
class User
{
@ManyToMany(fetch = FetchType.EAGER)
List<Group> groups;
}
Maintenant, quand j'essaie d'amener un Utilisateur à partir de la base de données qu'il apporte tous ses groupes et de tous les groupes d'amener tous ses utilisateurs et ainsi de suite. Enfin, je suis un stackoverflow exception.
Comment puis-je résoudre ce problème et ai encore ma bidirectionnelle de l'association et de la capacité à atteindre les objets dans les listes?
OriginalL'auteur refaelos | 2010-10-20
Vous devez vous connecter pour publier un commentaire.
Obtenez-vous le même problème si vous faites l'un des côtés de votre bidirectionnelle de l'association la posséder côté de l'association à l'aide de la
mappedBy
attribut (que vous devriez utiliser de toute façon)? Comme ceci:Mise à jour: je ne trouve pas de preuves que l'utilisation de
EAGER
aller chercher sur les deux côtés d'une association bidirectionnelle est interdit, et autant que je sache, il n'y a aucune mention d'une telle restriction dans la documentation Hibernate et /ou la spécification JPA.En fait, selon ce commentaire d'Emmanuel Bernard (pareil) question:
Pour moi, le ci-dessus est assez clair, Hibernate doit être capable de gérer votre cartographie (comme je l'ai mentionné dans un commentaire) et je serais tenté de considérer tout comportement contradictoire comme un bug.
Si vous pouvez fournir un cas de test permettant de reproduire le problème, ma suggestion serait d'ouvrir un sujet.
En fait, je m'attends à Hibernate pour détecter le cycle et de faire la bonne chose (mais je n'ai pas pris le temps de tester cette). D'autre part, je ne peux pas dire ce chargement avec impatience les deux côtés de un plusieurs-à-plusieurs ressemble à une bonne idée.
OriginalL'auteur Pascal Thivent
Veille prolongée fonctionne bien lorsqu'il essaie avec impatience pour aller chercher tout ce dont il a besoin. La modélisation des objets doit prendre hibernate en compte afin de boucles et stackoverflow exceptions ne se produira pas.
Ce que j'ai fait de retirer d'un côté de la relation. Vous pouvez décider si vous voulez supprimer de son côté ou de le quitter et de définir l'autre côté en tant que propriétaire. Vous aurez également besoin de retirer le chargement agressif de ce côté.
Ce serait bien si hibernate pourrait fournir un mécanisme pour définir la profondeur de l'extraction dans plusieurs-à-plusieurs liens.
OriginalL'auteur refaelos
Vous pouvez définir la propriété "mise en veille prolongée.max_fetch_depth" à quelque chose comme 3 de limiter le chargement agressif.
OriginalL'auteur Laures