Considérez ce scénario: P>
Quels sont les moyens de charger cette collection? P>
merci. p>
3 Réponses :
Je fais des hypothèses sur ce que l'utilisateur examine, mais il semble que vous ne vouliez que récupérer les enfants si l'utilisateur a déjà vu le parent et souhaite vraiment voir les enfants.
Pourquoi ne pas essayer ouvrir une nouvelle session et récupérer les enfants par leur parent? Quelque chose le long des lignes de ... p>
joli. J'ai raté que vous pourriez spécifier des objets dans une restriction.
Que faire si le champ «parent» est une collection?
La collection paresseuse peut être chargée à l'aide de hibernate.Initialize (parent.getcollection ()) sauf que l'objet parent doit être joint à une session active.
Cette solution prend l'entité mère et le nom du paresseux champ chargé et renvoie l'entité avec la collection entièrement chargée. p>
Malheureusement, lorsque le parent doit être reconstitué à la séance nouvellement ouverte, je ne peux pas utiliser de référence à la collection paresseuse, car cela se référait la version détachée de l'entité; D'où le nom de terrain et la réflexion. Pour la même raison, cela doit renvoyer l'entité mère ci-jointe. P>
Ainsi, dans le scénario OP, cet appel peut être effectué lorsque l'utilisateur choisit d'afficher la collection paresseuse: p>
public Entity initialize(Entity detachedParent,String fieldName) { // ...open a hibernate session... // reattaches parent to session Entity reattachedParent = (Entity) session.merge(detachedParent); // get the field from the entity and initialize it Field fieldToInitialize = detachedParent.getClass().getDeclaredField(fieldName); fieldToInitialize.setAccessible(true); Object objectToInitialize = fieldToInitialize.get(reattachedParent); Hibernate.initialize(objectToInitialize); return reattachedParent; }
Hibernate gère des collections de manière différente de ce que les champs normaux.
Dans mon travail, nous en abordons simplement en initialisant les champs de la charge initiale dont nous avons besoin au cas par cas. Par exemple, dans une méthode de charge de la façade entourée d'une transaction, vous pourriez avoir: p> et nous avons un appel de façade différent pour chaque intention. Cela permet essentiellement de ce dont vous avez besoin car vous avez besoin de charger ces champs spécifiques lorsque vous en avez besoin d'une autre manière et cela les met à la session à l'heure de la charge. P> P>
Je suppose que le côté bas de cette approche est N + 1 requêtes.