2009-04-19 11 views
0

をcompositeid:NHibernateは、コレクションと私は以下の表持つ

Bucket(
bucketId smallint (PK) 
name varchar(50) 
) 

BucketUser(
UserId varchar(10) (PK) 
bucketId smallint (PK) 
) 

複合キーではない問題は大丈夫thatsの私は、この問題を回避する方法を知っているが、私は私のバケットクラスはBucketUserのIListのをcontaninたいです。私はオンラインのリファレンスを読んで、私はそれをクラックしたと思ったが、havent。 2つのマッピングは

下回っている - バケツ -

<class name="Bucket,Impact.Dice.Core" table="Bucket"> 
    <id name="BucketId" column="BucketId" type="Int16" unsaved-value="0"> 
    <generator class="native"/> 
    </id> 

    <property column="BucketName" type="String" name="BucketName"/> 

    <bag name="Users" table="BucketUser" inverse="true" generic="true" lazy="true"> 
    <key> 
     <column name="BucketId" sql-type="smallint"/> 
     <column name="UserId" sql-type="varchar"/> 
    </key> 
    <one-to-many class="Bucket,Impact.Dice.Core" not-found="ignore"/> 
    </bag> 
</class> 

- bucketUser -

<class name="BucketUser,Impact.Dice.Core" table="BucketUser"> 
    <composite-id> 
    <key-many-to-one name="BucketUser" class="Bucket,Impact.Dice.Core" column="BucketId"/> 
    <key-property name="UserId" column="UserId" type="string"></key-property> 
    </composite-id> 
</class> 
+0

私は答えを明確にするために書きました。あなたのbucketuserのマッピングは見えません。あなたはそれを "コード"にする必要があります。 –

答えて

0

あなたはどのようなエラーを取得していますか?あなたが本当にマッピングすることを貼り付けカットアンドなら、解決策は、ピリオドで

<one-to-many class="Bucket,Impact.Dice.Core" not-found="ignore"/> 

にカンマを交換するのと同じくらい簡単かもしれません。

+0

こんにちは返信いただきありがとうございます。主キーは参照されている主キー(Bucket [BucketId]) "と同じ数のカラムを持たなければなりません"基本的にbucketidはバケットテーブルの主キーです(外部キーはFK32947277369BF2:Bucket [BucketId、UserId] bucketUserテーブルのforeighキーの部分 –

7

キーは、主キーではなく、包含エンティティの外部キーです。

あなたは2つのオプションがあります。

  • クラスは、自身のIDを持つ、独立したエンティティを表します。それは他のクラスから参照することができ、常に同じテーブルにあり、独立にロードすることができます。
  • またはそれは独立した同一性のない別のエンティティの一部です。他のクラスによって参照されている場合、それは常に別のテーブルにあります。親エンティティから独立して読み込むことはできませんでした。

Bucketuserは、理想的なエンティティです。それは独自のマッピング定義を持ち、それを1対多で参照します。あなたはあなたのケースで複合キーを取得しますが、私はこれを避けるでしょう。

<!-- reference to BucketUser. There is not table attribute needed. --> 
<bag name="Users" inverse="true" generic="true" lazy="true"> 
    <key> 
    <!-- foreign key --> 
    <column name="BucketId" sql-type="smallint" /> 
    </key> 
    <one-to-many class="Bucket,Impact.Dice.Core" not-found="ignore"/> 
</bag> 

<!-- BucketUser mapped as an independent entity --> 
<class name="BucketUser" ... > 
    <!-- here is the composite id, try to avoid this --> 
    <composite-id> 
    <key-property name="BucketId"> 
    <key-property name="UserId"> 
    </composite-id> 
</bag> 

BucketuserはBucketの従属部分です。

<!-- The table is defined on the fly by the table attribute --> 
<bag name="Users" table="BucketUser" inverse="true" generic="true" lazy="true"> 
    <key> 
    <column name="BucketId" sql-type="smallint" /> 
    </key> 
    <!-- use composite-element to define the contents of the table --> 
    <composite-element> 
    <!-- define the contents of the BucketUser here --> 
    <property name="UserId" sql-type="varchar"/> 
    </composite-element> 
</bag> 

それは戦略が適切であるあなたのケースによって異なります。バケットへの外部キーは、同時にプライマリキーです。

+0

inverse = trueの場合、コンポジット要素が実際には保存されていないことがわかります – JoshBerke

+0

@JoshBerke:ありそうですNHを意味する逆:それを保存しませんすでに別のパスから保存されています。 –

関連する問題