2009-05-25 7 views
2

Lorsque j'utilise NHibernate et le chargement paresseux, comment pourrais-je obtenir ce type de comportement:NHibernate et chargement paresseux: comment obtenir seulement quelques lignes de la collection?

J'ai une classe Customer, et le client a beaucoup d'adresses (disons 100 pour que cela ait plus de sens).

Je charge ma ligne client, je veux juste accéder à 3 éléments de la collection d'adresses.

Je ne veux pas nHibernate pour charger toutes les 100 adresses, mais avec le chargement paresseux de ce que je comprends, va charger tous les?

Je veux seulement 3 d'entre eux, et je veux charger tous les 3 à la fois, comment pourrais-je obtenir ce comportement?

Répondre

0

Il est possible d'ajouter une taille de lot, mais en rendant la taille de lot trop petite, vous risquez d'avoir de nombreux appels de base de données lors de l'itération.

0

Vous pouvez remplir la collection à l'aide de HQL ou d'un critère qui ne sélectionnerait qu'une seule adresse, mais vous ne pourrez pas accéder aux autres adresses à moins de recharger l'entité. Dans le pire des cas, vous auriez besoin du mot-clé Hibernate "with", qui n'a pas été implémenté dans NHibernate.

2
<class name="Customer"> 
    <set name="Address" batch-size="3"> 
     ... 
    </set> 
</class> 
4

Cela dépend de

  • si vous avez besoin « juste un » ou un certain un
  • si vous avez besoin d'autres éléments dans la liste plus tard dans la même session

Vous pouvez utiliser

  • filters à filtrer la collection. Ces filtres sont définis dans le fichier de mappage et activés et paramétrés lors de l'utilisation de la session
  • AliasToEntityMap result transformer qui vous permet de filtrer la collection dans une requête
  • batch fetching qui va chercher un certain nombre d'éléments à la fois.
1

Je pense que Lazy Loading ne vous aidera pas ici. Je voudrais prendre cette responsabilité à AddressDataProvider. Vous obtiendrez une collection d'adresses basées sur le client et d'autres prédicats (je pense que la première adresse n'a aucune valeur commerciale.) Une autre chose peut d'abord varier: l'ordre dans lequel les adresses sont renvoyées est arbitraire.)

etc.

Address GetLastVisited(Customer c); 
Address GetClosest(Customer c); 

Juste mes 2 cents.

0

Existe-t-il un critère commun pour ces enregistrements que vous voulez voir? (Par exemple: Quelque chose comme les adresses en cours? (Par exemple adresseFlag = 1?)

Si tel est le cas, vous pouvez utiliser une clause Where sur le mappage de collection.

par exemple:

<bag name="Addresses" where="CurrentAddressFlag = 1" cascade="save-update" fetch="select" lazy="true"> 
     <key column="AddressId"/> 
     <one-to-many class="Address"/> 
</bag> 
Questions connexes