J'ai vu qu'il y avait déjà eu une question dans le forum à ce sujet et que l'on conseillait de lire la doc.
Personnelement, j'ai bien lu la doc mais je dois avouer que tout n'est pas limpide.
Je vais écrire ici ce que j'ai compris. Si quelqu'un pouvait compléter mes explications légères, voire les etayer à l'aide d'un exemple concret, ce serait profitable.
Proxy :
1) En général
Ce design pattern permet de charger en mémoire une version légère de l'objet. L'objet n'est réellement chargé que quand on a besoin de toutes ses fonctionnalités.
L'exemple le plus classique est celui de l'image qui se charge dans un navigateur.
Tant que l'image n'est pas complétement chargée, on présente un rectangle.
<proxy>
<rectangle/>
</proxy>
Puis, une fois l'image chargée.
<proxy>
<image/>
</proxy>
L'intérêt est un gain de mémoire.
2)Appliqué à hibernate, voici ce que j'ai compris.
On charge un objet en mémoire depuis la base de donnée à l'aide d'un session.load ou d'un session.find.
Mais en fait, d'autres objets sont chargés via hibernate dans la même requête http. Plutôt que de tous les charger les uns à la suite des autres, on ne charge que les proxies.
Ce n'est que quand dans le code, l'objet est réellement utilisé, que l'on charge complètement l'objet.
Cela peut même se produire dans requête http postérieure.
Lazy loading : (chargement tardif ou différé)
C'est le moment ou le proxy charge complètement l'objet parce qu'il en a besoin.
Là où j'ai des doutes, c'est sur le déclenchement du chargement. Aussi sur le fait que le chargement peut avoir lieu dans une autre requête http, si on a juste fait un session.load dans la la première requête http et que c'est la deuxième qui exploite l'objet.
Merci d'avance pour votre aide dans la compréhension de ce mécanisme.
ps : pouvez-vous aussi succintement expliquer pourquoi la fermeture de la session doit être encapsulée dans un filtre pour que cela fonctionne ? Quels sont les contraintes à l'emploi de ce chargement tardif.[/b]
|