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

Но помимо этого я в тупике. Существуют фильтры, которые можно применять к коллекциям, но набор сотрудников во второй версии может не быть подмножеством сотрудников в первой версии, поэтому я не думаю, что это путь вперед. Я пытался, но это казалось тупиком. Есть ли способ указать запрос, но не только для сотрудников, у которых ClientId = Client.Id?

(Для «почему»: это связано с тем, как разные системы по-разному представляют данные.)


person Paul T Davies    schedule 23.08.2011    source источник


Ответы (1)


Я новичок в nhibernate, но это похоже на проблему, которая возникла из-за работы с базой данных заброшенных участков. Атрибут property-ref позволяет ссылаться на столбец, отличный от первичного ключа. Итак, в вашем случае это должно быть:

    <key column="AlternativeClientId" property-ref="AlternativeId"/>
person Peadar Doyle    schedule 23.08.2011
comment
Отлично, как раз то, что мне было нужно. Я уверен, что сталкивался с property-ref раньше, но когда искал его на этот раз, я потерял его среди всей документации Hibernate. Следует отметить, что поле property-ref должно быть сопоставлено, оно не может быть просто столбцом в таблице. - person Paul T Davies; 24.08.2011