2009-08-14 7 views
2

Est-il possible de naviguer à travers les associations clé-un-un d'un composite-id dans Nhibernate?La navigation dans la clé-plusieurs-à-un de composite-id est-elle possible?

J'ai quelques tables que je mis en correspondance avec les paramètres suivants (héritage):

<class name="StructureUser"> 
    <composite-id> 
     <key-many-to-one name="Structure" class="Structure" column="STRUKTUR_ID" /> 
     <key-many-to-one name="User" class="User" column="USERID" /> 
    </composite-id> 
    ... 
</class> 

<class name="Structure"> 
    <id name="Id" column="id" type="Int32" > 
     <generator class="native"/> 
    </id> 
    <property name="Low" column="low" type="Int32" /> 
    ... 
</class> 

Je veux accéder à la propriété « faible » de la structure par la classe StructureUser dans une requête. J'ai essayé chaque utilisation de l'API Criteria à laquelle je pouvais penser mais toujours une erreur. Voici deux des questions que j'ai essayé:

ICriteria crit1 = Session.CreateCriteria(typeof(StructureUser)) 
    .CreateAlias("Structure", "struc") 
    .Add(Restrictions.Le("struc.Low", 123)); 

ICriteria crit2 = Session.CreateCriteria(typeof(StructureUser)) 
    .Add(Restrictions.Le("Structure.Low", 123)); 

L'erreur dans crit1 provient de la base de données et dit que « struc_1.Low est pas valable dans ce contexte », parce que NHibernate ne génère pas la jointure nécessaire pour la restriction dans la commande sql. L'erreur dans crit2 provient de NHibernate, m'indiquant qu'elle ne peut pas accéder à la propriété "Structure.Low" sur StructureUser. J'ai contourné ce problème en déclarant l'ID composite avec des éléments de propriété clé et en déclarant les relations avec des éléments many-to-one normaux.

Existe-t-il une autre solution à ce problème?

+0

Je suis en cours d'exécution dans un problème similaire. –

Répondre

0

Avez-vous essayé

ICriteria crit1 = Session.CreateCriteria(typeof(StructureUser)) 
    .CreateCriteria("Structure", "struc") 
    .Add(Restrictions.Le("struc.Low", 123)); 
+0

Je ne me souviens pas :). Je dois l'essayer la semaine prochaine quand je serai de retour au travail. –

+0

Ok, ça m'a pris plus d'un an, mais j'ai finalement testé. Malheureusement, votre suggestion ne fonctionne pas non plus :(. –

+0

vous pouvez également essayer de créer l'alias avec .CreateAlias ​​("id.Structure", "struc") notez le minuscule 'id' qui est réservé à la propriété id abstrait Sur une autre note, j'ai trouvé que pour Composite-Id, la route de la classe Component est beaucoup plus facile à utiliser, mais elle est plus verbeuse à tous les niveaux – Jaguar

0

J'ai eu un problème similaire. Comme l'affiche originale dit, vous devez ajouter une relation plusieurs-à-un sur l'élément de la clé composite que vous voulez alias et vous devez définir les propriétés "insert" et "update" à "false" ".

Ensuite, vous pouvez le conserver dans l'ID composite, vous n'avez pas besoin de le changer en un élément de propriété clé.

<class name="StructureUser"> 
<composite-id> 
    <key-many-to-one name="Structure" class="Structure" column="STRUKTUR_ID" /> 
    <key-many-to-one name="User" class="User" column="USERID" /> 
</composite-id> 

<many-to-one name="Structure" class="Structure" column="STRUKTUR_ID" insert="false" update="false" /> 

... 

Questions connexes