-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 
Author Message
 Post subject: Stratégies de chargement avec lazy-loading ?
PostPosted: Sun Jun 26, 2005 9:35 am 
Newbie

Joined: Wed Dec 01, 2004 12:27 pm
Posts: 11
Hibernate version:

3.0

Hello

Si j'ai bien compris (je débute), Hibernate 3 (contrairement à Hibernate 2) considère que par défaut, le lazy-loading sur tous les objets est établi à true, c'est à dire que seul l'identifiant est accessible par défaut, et que pour accéder à des propriétés ou des relations, je dois d'abord les initialiser.

Par exemple, mais je ne sais pas s'il s'agit d'une bonne pratique, mais dans le code je me sers de la méthode size() sur une List, pour initialiser une relation. Je trouve ça légèrement problématique, car ça introduit une certaine dépendance vis à vis d'Hibernate dans le code, en lui faisant "connaitre" une stratégie de chargement liée au lazy-loading, alors que je pense qu'il n'a pas besoin de savoir comment s'adapter à l'ORM.

Comme on peut directement dans le fichier de mapping déclarer quels composants doivent utiliser ou non le lazy-loading, je voudrais savoir si c'est une bonne pratique de décrire uniquement les pratiques de chargement dans le mapping, au lieu de les déclarer dans le code ?

J'ai également une question subsidiare, si des utilisateurs de Spring fréquentent ce forum ;) : Spring propose une servlet, le pattern OpenSessionInViewFilter, positionnée directement en amont de la webapp dans le serveur d'applications, qui a pour but d'ouvrir automatiquement une session pour le chargement si le client, dans la couche de présentation, demande à accéder à des propriétés/relations d'un objet qui sont déclarées comme étant "lazy-loadables". En théorie ça résoud les problèmes de chargement et c'est performant, mais en pratique j'y trouve plusieurs inconvénients : d'abord on perd en quelque sorte le contrôle des stratégies de chargement, puisqu'on laisse le client décider, ensuite si jamais on donne à la couche de présentation un objet en partie initialisé, quand le client initialise une autre partie, et demande ensuite à persister cet objet, Hibernate lance une exception, car il ne sait pas quelle session utiliser pour enregistrer cet objet.

Quelle est la meilleure stratégie ?

Merci si quelqu'un peut m'éclairer :)


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jun 27, 2005 2:07 pm 
Hibernate Team
Hibernate Team

Joined: Thu Dec 18, 2003 9:55 am
Posts: 1977
Location: France
heu, comment dire, tu devrais reprendre depuis le debut ;)

La technique est de pré charger les graphe que tu as besoin via HQL par exemple et pas en utilisant des artifices comme .size().

Ensuite, positionne fetch="join" si tu veux charger systématiquement des associations.

Apres, le lazy loading est un gage de fiabilité, en effet si un objet n'est pas chargé, quoi de plus bourrin que de récupérer null alors que ce n'est pas vrai? Je prefere de loin recuperer un proxy et me prendre une lazyException, au moins je sais que durant ma conception, je n'ai pas suffisement chargé les graphes ou que j'ai mal géré la phase de ré attachement.
La dérive de ne rien charger et laisser faire le lazy loading est la responsabilité du developpeur... dans la plupart des cas web, ça n'a pas enormement d'impacts, parfois ça peut declencher un mechant n+1 select...

Enfin, le pattern open session in view n'a pas été inventé par Spring mais bien par les tous premiers utilisateurs d'Hibernate, il y a 3 ans...

Pour plus d'infos sur ces histoires de chargement, RDV chapitre 5 hibernate 3.0 chez Eyrolles.

_________________
Anthony,
Get value thanks to your skills: http://www.redhat.com/certification


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.