Два класса, сопоставленные одной таблице(один только для чтения), должны быть в правильном порядке?


Рассмотрим эти два класса, сопоставленные одной и той же таблице. Один читается только через 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 и более поздние сопоставления с той же таблицей не будут генерировать схему.

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

<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

1 ответ:

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

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

Создайте класс 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>();