使用NHibernate从连接的子类加载基类中的集合

使用NHibernate从连接的子类加载基类中的集合,nhibernate,collections,primary-key,base-class,joined-subclass,Nhibernate,Collections,Primary Key,Base Class,Joined Subclass,我有一个具有一些属性的类和一组名称,如下所示: public class A : BaseObject { private Int32 zindex; private Int32 atNmNr; private IList<G020_Namen> names = new List<G020_Namen>(); } <class name="A" table="A" lazy="true" > <cache usage="

我有一个具有一些属性的类和一组名称,如下所示:

public class A : BaseObject
{
    private Int32 zindex;
    private Int32 atNmNr;
    private IList<G020_Namen> names = new List<G020_Namen>();
}
    <class name="A" table="A" lazy="true" >
<cache usage="read-write"/>
<id name="Zindex" type="Int32" >
  <column name="Zindex" />
  <generator class="assigned" />
</id>
<property name="AtNmNr" type="Int32">
  <column name="ATNMNR"/>
</property>
<bag name="Namen" table="G020_Namen" inverse="true" cascade="all-delete-orphan" fetch="select" lazy="false" >
  <cache usage="read-write"/>
  <key>
    <column name="NMNR" />
  </key>
  <one-to-many class="G020_Namen" />
</bag>
<joined-subclass name="B" table="B" >
  <key column="Zindex" />
  <property name="Zindex" type="Int32">
    <column name="Zindex"/>
  </property>
  <property name="Etiketnaam" type="String">
    <column name="Etiketnaam"/>
  </property>
</joined-subclass>
A和B在主键上链接。类B在类A的映射文件中映射为一个连接的子类,如下所示:

public class A : BaseObject
{
    private Int32 zindex;
    private Int32 atNmNr;
    private IList<G020_Namen> names = new List<G020_Namen>();
}
    <class name="A" table="A" lazy="true" >
<cache usage="read-write"/>
<id name="Zindex" type="Int32" >
  <column name="Zindex" />
  <generator class="assigned" />
</id>
<property name="AtNmNr" type="Int32">
  <column name="ATNMNR"/>
</property>
<bag name="Namen" table="G020_Namen" inverse="true" cascade="all-delete-orphan" fetch="select" lazy="false" >
  <cache usage="read-write"/>
  <key>
    <column name="NMNR" />
  </key>
  <one-to-many class="G020_Namen" />
</bag>
<joined-subclass name="B" table="B" >
  <key column="Zindex" />
  <property name="Zindex" type="Int32">
    <column name="Zindex"/>
  </property>
  <property name="Etiketnaam" type="String">
    <column name="Etiketnaam"/>
  </property>
</joined-subclass>
它会产生以下SQL:

SELECT B.Zindex, B.Etiketnaam, G020_Namen.NMNAAM FROM B
INNER JOIN A ON B.Zindex = A.Zindex 
INNER JOIN G020_Namen ON B.Zindex = G020_Namen.NMNR
因此,它试图将具有名称的表链接到子类表B的主键,而不是基表A的外键。它应该是:

SELECT B.Zindex, B.Etiketnaam, G020_Namen.NMNAAM FROM B
INNER JOIN A ON B.Zindex = A.Zindex 
INNER JOIN G020_Namen ON A.AtNnNr = G020_Namen.NMNR
问题是:是否可以使用ICriteria语句使NHibernate在基类上从子类加载集合?

谢谢


马丁·范德林登。

你的期望不正确:

A.AtNnNr=G020\u Namen.NMNR上的内部联接G020\u Namen

AtNnNr甚至没有映射。如果您的意思是ATNMNR,则不应在join中使用它,因为它是一个没有FK的简单列。请添加有关以下内容的更多信息:

但是如果我想检索子类B的记录 未加载名称(在基类A上)

什么东西没装?名字还是字母?怎么没装?异常还是空集合

作为补充说明,您的映射不是最优的

  • 看起来您希望急切地加载收藏(
    lazy=“false”
    )。在这种情况下,使用
    fetch=“join”
    而不是
    fetch=“select”
    来避免额外的选择

  • 在类B上不需要
    。如果使zindex受保护,则可以从基类中获得该属性


非常感谢您的帮助。您认为AtMnNr未映射为外键是解决方案。将AtMnNr映射为Nhibernate后,可以正确找到具有名称的表。