J'ai une instance d'une classe que j'ai obtenue à partir d'une session Hibernate. Cette session est révolue depuis longtemps. Maintenant, j'appelle toString()
et j'obtiens le LazyInitializationException: could not initialize proxy - no Session
attendu puisque j'essaye d'accéder à une référence qu'Hibernate n'a pas résolue pendant le chargement de l'instance (chargement paresseux).Comment implémenter toString() dans une classe mappée avec Hibernate?
Je ne veux pas vraiment faire le chargement désireux puisqu'il changerait la requête d'environ 120 caractères à plus de 4KB (avec huit jointures). Et je n'ai pas à: Tout ce que je veux afficher dans toString()
est l'ID de l'objet référencé; c'est-à-dire quelque chose qu'Hibernate doit savoir à ce moment (ou il ne peut pas faire le chargement paresseux).
Donc, ma question: Comment gérez-vous ce cas? N'essayez jamais d'utiliser des références dans toString()
? Ou appelez-vous toString()
dans le code de chargement juste au cas où? Ou y at-il une fonction d'utilité dans Hibernate qui va retourner quelque chose d'utile quand je lui passe une référence qui pourrait être être paresseux? Ou évitez-vous les références au toString()
?
Si Java a la fermeture, vous pouvez faire: String x = lazyToString ({=> this.getY()}) + lazyToString ({=> this.getZ()}); et attraper l'expection dans la méthode lazyToString. L'overhead avec classes internes (ou try/catch) est trop élevé pour le faire. –
Oui, mais ça ne me donnerait pas une séance non plus. –
C'est vrai. Vous pouvez seulement imprimer que la valeur n'est pas chargée. Je pensais que c'était l'intention. Vous ne pourrez pas démarrer une session et associer l'objet à l'appel de la méthode toString. –