4 votes

Modification du comportement initial de LazyLoad dans NHibernate

Je viens de commencer à utiliser NHibernate et fluent-NHibernate, que je trouve formidables. J'ai configuré tous mes mappings pour qu'ils utilisent LazyLoading pour toutes les relations entre les classes, car je trouve généralement qu'il n'est pas nécessaire de tout charger en amont. Cependant, il arrive que l'on sache à 100% que l'on va charger toutes les relations ou au moins une relation et cela permet d'économiser la ou les connexions supplémentaires si l'on obtient les données en amont.

Est-il possible d'indiquer à NHibernate de charger les données de relation pour une relation et de remplacer le paramètre initial ?

J'utilisais LinqToSql avant, pour cela je créais des référentiels qui avaient une surcharge de quels éléments devaient se charger dans quelles relations quand c'était nécessaire. Cela fonctionnait très bien et je voudrais quelque chose de similaire pour NHibernate.

7voto

John_ Points 1842

J'ai découvert que l'on peut utiliser la fonction LazyLoading / Eager loading des requêtes NHibernate.

Créez votre ICriteria de la manière habituelle, puis le nom de l'association (propriété de la relation, pour moi ce sont les prix) et enfin le type de récupération qui peut être jointe, sélectionnée, paresseuse ou avide.

.SetFetchMode("Prices", FetchMode.Join)

0voto

Gary Joynes Points 411

Si vous exécutez une requête HQL, vous pouvez utiliser "left outer join fetch" ou "left join fetch" pour joindre l'association que vous souhaitez récupérer plutôt que de la charger paresseusement, par ex.

Si vous avez une classe de bâtiment qui a une propriété renvoyant un objet Adresse et que cette relation est chargée paresseusement, vous pouvez avoir une requête HQL similaire à celle-ci :

string hql = "from Building bld where bld.Type.Id = 1";

Lorsque l'on accède à la propriété Adresse pour chaque bâtiment, une autre instruction SQL sera exécutée. En remplaçant la requête HQL par la suivante, les adresses seront récupérées dans le cadre de l'instruction SQL originale :

string hql = "from Building bld left outer join fetch bld.Address as addr where bld.Type.Id = 1";

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X