Два класса, сопоставленные с одной и той же таблицей (один только для чтения), должны быть в правильном порядке? - PullRequest
2 голосов
/ 28 августа 2009

Рассмотрим эти два класса, сопоставленные с одной и той же таблицей. Один только для чтения через mutable = "false".

<class name="Funder" table="funder">
    <id name="id">
      <generator class="identity" />
    </id>
    <property name="funder_name" />
    <property name="contact_name" />
    <property name="addr_line_1" />
    <property name="addr_line_2" />
    <property name="addr_line_3" />
    <property name="city" />
    <many-to-one name="state" column="state_id" foreign-key="FK_funder_state_id" fetch="join" />
    <property name="zip_code" length="10" />
    <property name="phone_number" length="30" />

    <property name="create_dt" update="false" not-null="true" />
    <many-to-one name="create_by" column="create_by" not-null="true" update="false" foreign-key="FK_funder_create_by" fetch="join" />
    <property name="last_update_dt" insert="false" />
    <many-to-one name="last_update_by" insert="false" foreign-key="FK_funder_last_update_by" fetch="join" />

  </class>

  <class name="FunderSimple" table="funder" schema-action="none" mutable="false">
    <id name="id">
      <generator class="identity" />
    </id>
    <property name="funder_name" />
    <property name="contact_name" />
    <property name="phone_number" />
  </class>

Если я перемещу отображение FunderSimple до отображения Funder, моя схема не сгенерирует правильно. Если я оставлю это как выше, это работает.

Это задумано? Кажется, что schema-action = "none" придерживается table_name, и последующие сопоставления с той же таблицей не будут генерировать схему.

Я делаю это так, потому что у меня есть другой класс с именем Contract, у которого есть внешний ключ к таблице спонсоров. Однако мне не нужны все столбцы спонсора при обращении к объекту контракта.

<many-to-one name="funder_simple" column="funder_id"  foreign-key="FK_contract_funder_id" fetch="join" />

Funder не наследует от FunderSimple.

Должен ли я использовать другую технику для извлечения только подмножества столбцов из таблицы внешнего ключа? Много-к-одному - единственный способ настроить внешний ключ?

с использованием версии 2.1.0.4000

1 Ответ

2 голосов
/ 02 сентября 2009

Для таких ситуаций я использую проекции вместо. Я никогда не отображал два типа в одну и ту же таблицу (за исключением случаев наследования).

Итак, что я делаю в такой ситуации:

создайте класс FunderSimple и импортируйте его так, чтобы он был известен NHibernate:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <import class="MyNamespace.FunderSimple" />
</hibernate-mapping>

Как только вы это сделаете, вы можете создать запрос для вашего типа 'Funder' с помощью API-интерфейса ICriteria, но вы можете указать, что вы хотите, чтобы NHibernate возвращал экземпляры FunderSimple. Таким образом, NHibernate достаточно умен, чтобы генерировать упрощенный запрос SQL, который извлекает только те столбцы, которые необходимы для заполнения экземпляров класса FunderSimple.

Это делается так:

ICriteria crit = session.CreateCriteria (typeof(Funder));
// add some expressions ...
crit.Add ( ... );

// Now, set the projection, and specify that FunderSimple should be returned
crit.SetProjection (Projections.ProjectionList()
                         .Add (Projections.Property ("Id"), "Id")
                         .Add (Projections.Property ("funder_name"), "funder_name")
                         .Add (Projections.Property ("phone_number"), "phone_number"));

crit.SetResultTransformer (Transformers.AliasToBean (typeof(FunderSimple)));

crit.List <FunderSimple>();
...