NHibernate - 将基于不同属性的集合映射到标识

时间:2011-08-23 16:13:58

标签: hibernate nhibernate nhibernate-mapping bag

考虑以下表格:

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的员工?

(对于'为什么':这与不同系统如何具有不同的数据视图有关。)

1 个答案:

答案 0 :(得分:2)

我对nhibernate很新,但这听起来像是因为使用棕色数据库而遇到的问题。 property-ref属性允许引用除主键之外的列。所以在你的情况下它应该是:

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