2009-08-14 12 views
2

Nhibernateのcomposite-idのキーと多対1の関連付けをナビゲートすることはできますか?composite-idのキーを多対1でナビゲートすることは可能ですか?

<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> 

は、私は、クエリでStructureUserクラスを介して構造の「Low」のプロパティにアクセスしたい:

は、私は次の設定でマッピングされた数(レガシー)のテーブルを持っています。私は考えることができるCriteria APIのすべての使い方を試しましたが、常にエラーです。ここに私が試したクエリの2つです:

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)); 

crit1にエラーがデータベースから来て、NHibernateのは、のために必要なジョインを生成しないので、「struc_1.Lowは、このコンテキストでは有効ではない」ことを言います、 sqlコマンドの制限。 crit2のエラーはNHibernateから来ており、StructureUserの "Structure.Low"プロパティにアクセスできないことを伝えています。

私はkey-property要素でcomposite-idを宣言し、通常のmany-to-one要素との関係を宣言することでこの問題を回避しました。

この問題を解決する別の方法はありますか?

+0

私は同様の問題に実行していますよ。 –

答えて

0

は、あなたが、私は同様の問題があった

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

私は覚えていない:)。私が仕事に戻ったときに来週にそれを試してみてください。 –

+0

それは私に1年以上かかりましたが、ついにそれをテストしました。残念ながら、あなたの提案はどちらもうまくいかない:(。 –

+0

.CreateAlias( "id.Structure"、 "struc")でエイリアスを作成しようとすると、抽象的なidプロパティ用に予約されている小文字の 'id'もう一つの注意点として、私はComposite-IdのためにComponentクラスのルートが使いやすいと分かっていますが、すべてのレベルでより冗長です – Jaguar

0

を試してみました。

元の投稿によると、別名にする複合キーの要素に多対1の関係を追加する必要があり、プロパティ "insert"と "update"をfalseに設定する必要があります"

これをcomposite-idに入れておくことができます。これをkey-property要素に変更する必要はありません。

<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" /> 

... 

関連する問題