10
votes

Comment puis-je accéder aux champs chargés de paresseux après la fermeture de la session, en utilisant Hibernate?

Considérez ce scénario:

  • J'ai chargé une entité mère via Hibernate
  • Parent contient une collection d'enfants grandes et paresseuses chargées
  • La session Hibernate est fermée après cette charge initiale pendant que l'utilisateur considère les données parent
  • L'utilisateur peut choisir de visualiser le contenu de la collection d'enfants paresseux
  • Je souhaite maintenant charger cette collection

    Quels sont les moyens de charger cette collection?

    • Supposons la session-in-View n'est pas une option car la récupération de la collection d'enfants ne se produirait qu'une fois que l'utilisateur a vu le parent et a décidé de voir les enfants.
    • Il s'agit d'un service qui sera accessible à distance par le client Web et sur le client de bureau.

      merci.


0 commentaires

3 Réponses :


3
votes

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 ... xxx


2 commentaires

joli. J'ai raté que vous pourriez spécifier des objets dans une restriction.


Que faire si le champ «parent» est une collection?



10
votes

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;
}


0 commentaires

0
votes

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: xxx

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.


1 commentaires

Je suppose que le côté bas de cette approche est N + 1 requêtes.