2011-08-23 21 views
0

考慮以下表的集合:NHibernate的 - 映射基於不同屬性的身份

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> 

如果我得到一個客戶,我也得到Employee.Client = Client.Id的員工集合。大。

現在考慮這個:

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

但除此之外,我難倒。有些過濾器可以應用到集合中,但第二個版本中的Employees集可能不是第一個版本中的Employees集的子集,所以我認爲這不是前進的方向。我試過了,但似乎是一個死衚衕。是否有某種指定查詢的方式,但不僅僅是具有ClientId = Client.Id的員工?

(對於「個爲什麼」:這是一個與系統是如何不同而有不同的數據視圖做)。

回答

2

我是很新,NHibernate的,但是這聽起來像一個問題,因爲有工作,我有棕地數據庫。 property-ref屬性允許引用主鍵以外的列。所以在你的情況下,它應該是:

<key column="AlternativeClientId" property-ref="AlternativeId"/> 
+0

非常好,正是我所需要的。我確信我之前遇到過property-ref,但是這次找到它時,我在所有Hibernate文檔中丟失了它。有一件事要注意,property-ref字段必須被映射,它不能只是表中的一列。 –