考虑以下表格:
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>
如果我获得了客户端,我还会获得Employeees的集合,其中Employee.Client = Client.Id。大。
现在考虑一下:
Client(Id bigint, Name varchar(50), AlternativeId int)
Employee(Id bigint, Name varchar(50), ClientId bigint, AlternativeClientId int)
我想返回一个客户端,其中包含Employeees,其中Employee.AlternativeClientId = Client.AlternativeId。
我认为关键节点现在会读取:
<key column="`AlternativeClientId`"/>
但除此之外,我很难过。有些过滤器可以应用于集合,但第二个版本中的Employees集合可能不是第一个版本中Employees的子集,因此我认为这不是前进的方法。我试过但这似乎是一个死路一条。是否有某种方式指定查询,但不仅仅是在具有ClientId = Client.Id的员工?
(对于'为什么':这与不同系统如何具有不同的数据视图有关。)
答案 0 :(得分:2)
我对nhibernate很新,但这听起来像是因为使用棕色数据库而遇到的问题。 property-ref属性允许引用除主键之外的列。所以在你的情况下它应该是:
<key column="AlternativeClientId" property-ref="AlternativeId"/>