Je me lance clairement pour comprendre cela, donc aidez grandement apprécié ...
J'ai le mappage suivant: p> dans mon dB j'ai: p> Cependant, p> retourne null. p> Peut-être que quelqu'un peut voir ce que j'ai manqué? P > merci, p. p> Il semble être plus de plus à faire avec l'état de la session en ce que la collection n'est pas renseignée dans Le contexte de la même session, mais la collection est remplie dans la prochaine session ... p> Considérez les éléments suivants: P> DEBUG - existing not just added: parent id: 13, Children is size:1
DEBUG - new one before commit: parent id: 23, Children is null
DEBUG - new one after commit: parent id: 23, Children is null
DEBUG - new one after re-fetch: parent id: 23, Children is null
4 Réponses :
Dans votre question initiale, cela impliquait que les données existaient déjà dans la base de données avant d'ouvrir la session, c'était une information essentielle pour savoir que vous l'enregistrez dans la même session ...
Voici l'hibernate officiel Conseils sur ce sujet à la manière suivante: (Pris de http://community.jboss.org/wiki/hibernatefaq-commonproblèmes ) p>
Lorsque vous mettez à jour une association bidirectionnelle, vous devez mettre à jour les deux extrémités. P> parent.getChildren().add(child);
child.setParent(parent);
Le fait que c'est une liste est hors de propos. De plus, si getchildren () code> renvoie null, alors un parent code> est chargé avec succès, la lecture de la base de données semble donc fonctionner.
Ajout d'un attribut cascade dans le cadre de votre entité onetomany dans l'entité parent peut résoudre le problème.
ParentEntity parent = new ParentEntity(); ChildEntity child = new ChildEntity(); child.setParent(parent); parent.getChildren().add(child); session.save(parent);
Correct, mais pas le problème ici :)
Oui, STIT ne déclenche pas l'actualisation du cache de session.
L'approche typique ici consiste à utiliser le modèle de session-per-demande, de sorte que vous fermez la session immédiatement après commettre et ouvrez une autre session pour ce qui suit. Transactions (bien que ce ne soit pas une option si vous utilisez Session ouverte dans le modèle de vue ). P>
Une autre bonne pratique qui peut aider à résoudre ce problème est de modifier simultanément les deux côtés de la relation bidirectionnelle: p> de cette façon, vous pouvez conserver des objets dans le cache de session dans la cohérence Etat. P> Enfin, si vous devez réellement rafraîchir un objet à l'intérieur d'une session, vous pouvez appeler session.refresh () code> dessus. p> p>
La solution que j'utilise pour le moment est Pour initialiser la collection manuellement pendant la construction:
private List<ChildEntity> children
= new ArrayList<ChildEntity>;
Avez-vous des informations utiles lorsque vous regardez les données de débogage Hibernate?
S'il vous plaît voir Modifier. BTW DB est Postgres, je suis également dans un environnement de tapisserie à l'aide du module Tapestry-Hibernate.