如何避免每个表继承使用NHibernate 2.1的连接

时间:2009-08-26 19:22:53

标签: nhibernate inheritance

我正在做一些表继承并且一切都很好 - 但我注意到当我想要基本实体(基表数据)时NHProf在子实体/(相关表)上显示左外连接

如何将默认行为设置为仅查询所需数据 - 例如:当我想要父元素列表(并且只有那些数据)时,查询只返回该元素。

现在我的映射类似于以下内容:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="FormBase, ClassLibrary1" table="tbl_FormBase">
    <id name="BaseID" column="ID" type="Int32" unsaved-value="0">
      <generator class="native" />
    </id>
    <property name="ImportDate" column="ImportDate" type="datetime" not-null="false" />
    <joined-subclass table="tbl_Form" name="Form, ClassLibrary1">
      <key column="ID"/>
      <property name="gendate" column="gendate" type="string" not-null="false" />
    </joined-subclass>
  </class>
</hibernate-mapping>

我希望所有数据返回的示例与仅实现父实体的示例如下所示:

    Dim r As New FormRepository()
    Dim forms As List(Of Form) = r.GetFormCollection().ToList()



    Dim fbr As New FormBaseRepository()
    Dim fb As List(Of FormBase) = fbr.GetFormBaseCollection().ToList()

1 个答案:

答案 0 :(得分:2)

你做不到。它被称为“隐式多态”,它是一个相当不错的(虽然在你的情况下是不需要的:-))Hibernate提供的功能。查询基础对象列表时,返回的实际实例属于实际的具体实现。因此,Hibernate需要左连接来查明特定实体是FormBase还是Form。

更新(太大而不适合评论): 这里的一般问题是,如果你要欺骗Hibernate只加载基本实体,你可能会得到不一致的会话状态。请考虑以下事项:

  1. Form实例(持久存储到form_baseform表)以某种方式加载为FormBase
  2. 您已将其删除。
  3. 在刷新Hibernate期间(它认为我们正在处理FormBase并因此幸福地意识到涉及2个表)发出DELETE FROM form语句,当FK被违反时会抛出异常。
  4. 隐含多态性的存在是为了防止这种情况发生 - Form 始终一个Form,而不是FormBase。当然,您可以使用“每层次表”映射,其中所有内容都在同一个表中,因此不需要连接,但最终会(可能)有很多NULL列,并且 - 无法指定儿童的财产不为空。

    所有这一切,如果这是真的一个巨大的性能问题(它通常不应该 - 可能是一个索引连接),你可以尝试使用本机查询返回FormBase个实例。