我正在做一些表继承并且一切都很好 - 但我注意到当我想要基本实体(基表数据)时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()
答案 0 :(得分:2)
你做不到。它被称为“隐式多态”,它是一个相当不错的(虽然在你的情况下是不需要的:-))Hibernate提供的功能。查询基础对象列表时,返回的实际实例属于实际的具体实现。因此,Hibernate需要左连接来查明特定实体是FormBase还是Form。
更新(太大而不适合评论): 这里的一般问题是,如果你要欺骗Hibernate只加载基本实体,你可能会得到不一致的会话状态。请考虑以下事项:
Form
实例(持久存储到form_base
和form
表)以某种方式加载为FormBase
。FormBase
并因此幸福地意识到涉及2个表)发出DELETE FROM form
语句,当FK被违反时会抛出异常。隐含多态性的存在是为了防止这种情况发生 - Form
始终一个Form
,而不是FormBase
。当然,您可以使用“每层次表”映射,其中所有内容都在同一个表中,因此不需要连接,但最终会(可能)有很多NULL列,并且 - 无法指定儿童的财产不为空。
所有这一切,如果这是真的一个巨大的性能问题(它通常不应该 - 可能是一个索引连接),你可以尝试使用本机查询返回FormBase
个实例。