0

J'ai une telle structure de domaine (par exemple, le code pseudo):NHibernate cartographie spécifique ("sélection avec grand-parent")

class Room 
{ 
    Id: long 
    Shelves: list of Shelf 
} 

class Shelf 
{ 
    Id: long 
    Room: Room class (room_id column) 
    Books: list of Book 
} 

class Book 
{ 
    Id: long (id column) 
    Shelf: Shelf class (shelf_id column) 
    Room: Room class (room_id column) 
    Title: string (title column) 
} 

Chaque collection est paresseux. J'aimerais savoir s'il existe un moyen de récupérer tous les livres d'une pièce (sans sous-sélection) lorsque j'accède à la propriété d'un étagère paresseusement.

Quand je reçois chambre, NHibernate récupère la chambre seulement (select * from rooms r where ...), quand j'accéder à la propriété des étagères, NHibernate va chercher toutes les étagères pour cette chambre (select * from shelves s where s.room_id = X), quand j'accéder à la propriété Livres il charge livres pour la seule tablette (ce qui est Normalement en général), mais ...

Dans mon cas, si j'accède au livre, il y a de fortes chances que je travaille avec d'autres livres de cette pièce aussi, donc si je touche le livre je veux précharger tous les livres pour cela salle et les mettre sur leurs étagères.

La caractéristique la plus proche de nhibernate est fetch='subselect'. Mais il est inutile de sélectionner dans mon cas, car je peux chercher des livres pour cette pièce par room_id: select * from books b where b.room_id = x.

Existe-t-il un moyen de le faire?

Merci!

Répondre

0

J'ai trouvé une solution plus élégante. Il se trouve que je peux définir sql-requête pour un sac/carte ...

Il ressemble à:

<hibernate-mapping...> 
    <class name="Shelf"> 
     <many-to-one name="Room" column="room_id"... /> 

     <bag name="Books"> 
      ... 

      <loader query-ref="ShelvesQuery" /> 
     </bag> 
    </class> 

    <sql-query name="ShelvesQuery"> 
     <load-collection alias="book" role="Shelf.Books" /> 

     <![CDATA[ 
      select b.id 
       b.room_id, 
       b.shelf_id, 
       b.title 
      from books b 
      where b.room_id = :room_id 
     ]]> 
    </sql-query> 
</hibernate-mapping> 

Il fonctionne comme un charme!

1

La manière native intégrée dans NHibernate est appelé lot enjoués:

19.1.5. Using batch fetching

NHibernate peut utiliser efficacement le chargement par lot, qui est, NHibernate peut charger plusieurs mandataires non initialisées si un proxy est accessible (La récupération par lot est une optimisation de la stratégie de récupération de sélection paresseuse Il existe deux façons de régler la récupération par lots: sur la classe et le niveau de la collection

Plus de détails (sauf le lien doc ci-dessus) peuvent être trouvés ici: