代码之家  ›  专栏  ›  技术社区  ›  Toran Billups

如何使用每个表继承的nhibernate 2.1避免联接

  •  1
  • Toran Billups  · 技术社区  · 15 年前

    我做了一些表继承,所有的工作都很好,但是我注意到当我需要基本实体(基本表数据)时,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 回复  |  直到 15 年前
        1
  •  2
  •   ChssPly76    15 年前

    你不能。它被称为“隐式多态性”,是Hibernate提供的一个相当好的(尽管在你的例子中是不需要的):-)特性。查询基本对象列表时,返回的实际实例是实际具体实现的实例。因此,Hibernate需要使用左联接来确定特定实体是FormBase还是Form。

    更新 (太大,无法置入评论): 这里的一般问题是,如果要欺骗Hibernate只加载基本实体,那么最终可能会出现不一致的会话状态。考虑以下事项:

    1. Form 实例(持久化到两者 form_base form 表)以某种方式加载为 FormBase .
    2. 你已经删除了它。
    3. 在同花顺冬眠期间 模板库 因此幸运的是,我们没有意识到有两个表参与其中)问题a DELETE FROM form 违反fk时引发异常的语句。

    隐式多态性的存在是为了防止这种情况的发生。- 形式 总是 形式 ,从来没有 模板库 . 当然,您可以使用“每个层次结构的表”映射,其中所有内容都在同一个表中,因此不需要联接,但最终(可能)会得到许多空列,并且-ergo-无法在子属性上指定非空。

    所有这些都说,如果这是 真的? 对于您来说,这是一个巨大的性能问题(通常不应该是——可能是一个索引连接),您可以尝试使用本机查询返回 模板库 实例。