映射到同一个表(一个只读)的两个类必须按正确的顺序排列?

时间:2009-08-28 14:21:41

标签: nhibernate nhibernate-mapping

考虑映射到同一个表的这两个类。一个是readonly via 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>

如果我在Funder映射之前移动FunderSimple映射,我的架构正确生成。如果我按原样离开它,它就可以工作。

这是设计的吗?似乎schema-action =“none”坚持table_name,后来映射到同一个表将不会生成模式。

我这样做是因为我有另一个名为Contract的类,它有一个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 个答案:

答案 0 :(得分:2)

对于这种情况,我使用投影代替。 我从未将两种类型映射到同一个表中(除非是为了继承原因)。

所以,在这种情况下我做的是:

创建FunderSimple类,并导入它以便NHibernate知道它:

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

完成此操作后,您可以使用ICriteria API在“Funder”类型上创建查询,但是,您可以指定您希望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>();