0

次の表を検討してください。

Client(Id bigint, Name varchar(50))
Employee(Id bigint, Name varchar(50), ClientId bigint)

次のようにマッピングされます。

<class name="Client" table="`Client`">
  <id name="Id" column="`Id`" type="long">
    <generator class="native" />
  </id>
  <property name="Name" column="`Name`" />
  <bag name="Employees" cascade="all" inverse="true" >
    <key column="`ClientId`" />
    <one-to-many class="Employee" />
  </bag>
</class>

<class name="Employee" table="`Employee`">
  <id name="Id" column="`Id`" type="long">
    <generator class="native" />
  </id>
  <property name="Name" column="`Name`" />
  <many-to-one name="Client" cascade="all" column="`ClientId`" />
</class>

Client を取得すると、Employee.Client = Client.Id である Employees のコレクションも取得します。偉大な。

これを考慮してください:

Client(Id bigint, Name varchar(50), AlternativeId int)
Employee(Id bigint, Name varchar(50), ClientId bigint, AlternativeClientId int)

Employee.AlternativeClientId = Client.AlternativeId である従業員のコレクションを持つクライアントを返したいと思います。

キーノードは次のようになると思います。

<key column="`AlternativeClientId`"/>

しかし、それを超えて私は困惑しています。コレクションに適用できるフィルターはありますが、2 番目のバージョンの Employees のセットは最初のバージョンの Employees のサブセットではない可能性があるため、それは今後の方法ではないと思います。試してみましたが、行き止まりのようでした。ClientId = Client.Idを持つ従業員だけでなく、クエリを指定する方法はありますか?

(「理由」については、システムが異なればデータの見方が異なることに関係しています。)

4

1 に答える 1

2

私はnhibernateにはかなり慣れていませんが、これはブラウンフィールドデータベースでの作業が原因で発生した問題のように思えます. property-ref 属性を使用すると、主キー以外の列を参照できます。したがって、あなたの場合は次のようになります。

    <key column="AlternativeClientId" property-ref="AlternativeId"/>
于 2011-08-23T21:11:53.357 に答える