2010-10-05 8 views
14

J'ai créé une classe dans laquelle j'ai défini certains de ses champs (autres entités) pour être chargé par LAZY. Maintenant, j'ai besoin d'utiliser cet objet après qu'il a été détaché de la session, donc je dois évidemment m'assurer que tous les champs dont j'ai besoin sont remplis avant de le détacher. J'ai essayé juste d'appeler les getters à ces champs paresseux mais cela n'a pas semblé fonctionner. Quelqu'un a-t-il une idée pour forcer le chargement de ces champs?Hibernate chargement paresseux dans les objets détachés

+0

êtes-vous sûr que votre session est ouverte lors de l'appel getters? –

+0

Session si définitivement ouvert quand j'appelle les getters –

Répondre

11
Hibernate.initialize(yourObject) 

va forcer l'initialisation de l'objet/collection qui lui est passé. Vous avez besoin d'une session active pour cela.

Si l'entité est détachée, vous devez rattacher l'objet (en utilisant merge(..)) à une session active, puis l'initialiser.

+0

+1 Bozho ......... –

+1

'merge' est juste pour des cas très spéciaux. En règle générale, je recommanderais 'update' – pakore

+0

@pakore - eh bien, la différence que je pense est que' merge (..) 'peut également insérer un nouvel enregistrement. Mais je suis plus habitué à la sémantique JPA, donc c'est peut-être un peu différent ici. – Bozho

3

Vous pouvez le rattacher à la session. C'est la manière normale.

session.update(yourObject); //This reattachs the object to the current session. 
yourObject.someGetter(); //This will work now. 
1

Je sais que vous avez demandé Hibernate, mais EclipseLink a cette fonction de sorte qu'il pourrait être utile de vérifier si vous utilisez JPA et non lié à une implémentation donnée. Vous pourriez rencontrer d'autres problèmes à la migration EclipseLink si ..

2
<prop key="hibernate.enable_lazy_load_no_trans">true</prop> 

vous pouvez ajouter cette ligne dans votre fichier de configuration, il peut chercher vos objets paresseux même est détaché, mais il devrait être utiliser la version post 4.1.7 comme il y a un problème de fuite de connexion avec la version précédente.voir here