Bonjour à tous,
encore un nouveau post, à propos des sessions & co.
Pour utliliser dans une JSP une entité possédant un attribut LAZY (typiquement pour moi, des collections, avec oneToMany ou autre), il faut être dans une session.
Dites moi si j'ai mal compris, mais:
Quand on est dans un EJB, cela ne pose aucun problème car les méthodes, pour les stateless par exemple, s'occupent de cette gestion des session.
Mais si on se trouve dans la vue, il faudra se débrouiller, d'une façon ou d'une autre, pour se retrouver dans une session.
D'après ce que je vois un peu partout, on a l'habitude d'utiliser des filtres pour cela, mais deux choses:
1) Je ne suis pas très familier de ce genre de méthodes pour l'instant ( ca c'est pas un gros problème, je vois bien le principe ).
2) Ces filtres utilisent des classes provenant d'Hibernate, ce qui me pose la question de la portabilité!
Une autre solution que j'ai vue est d'utiliser de l'EJB-QL pour récupérer la collection définie en LAZY avant de la retourner à la vue.
Mais cela me parait particulièrement bizarre car:
1) On casse l'intérêt de l'annotation @oneToMany, puisqu'on écrit explicitement la requête qui devrait être gérée par les annotations.
2) On casse aussi l'intéret du lazy puisque maintenant la collection va rester présente hors session, donc même lorsqu'on n'en veut pas, donc pas LAZY.
Il y a probablement des petites erreurs de raisonnement dans ma vision des choses, surtout n'hésitez pas à me corriger.
Toujours est il que j'ai testé autre chose qui fonctionne, et je voudrais votre avis à ce sujet:
Ma solution consiste simplement à cloner les entités dont on a besoin.
Par exemple, supposons que l'on veuille, dans une vue, récupérer une entité personne composée d'une collection d'addresses en fonction de son nom, alors on aura dans notre EJB stateless "manager" une méthode getPersonByName(String name) qui recherchera la personne, et notre entité personne aura une méthode clone. C'est donc ce clone que l'on retournera!
Je vois bien un désavantage évident, la mémoire utiilisée par le clonage, mais à bien y réflechir, dés que la méthode getPersonByName sera terminée, la collection étant en lazy, la mémoire associée sera déchargée (non?). L'autre désavantage est qu'il faudra d'autres méthodes dans l'EJB stateles "manager" pour synchroniser les données clonnées avec lesentités persistante.
Voila voila, descendez moi pour toutes les bétises que j'ai du dire! :)
|