加入NHibernate中每个Class层次结构的子类

时间:2011-01-19 19:17:31

标签: nhibernate mapping joined-subclass

我在NHibernate中使用每个子类的表映射继承。我有一个父Attribute表和一个子AccountAttribute表。子AccountAttribute表中有另一个外键到CustomerProfile表。 CustomerProfile表与AccountAttribute表的关系为零或更多;意思是我的AccountAttributes课程中会有CustomerProfile的集合。

如何在我的NHibernate映射中将CustomerProfile表映射到AccountAttribute表,以便CustomerProfile类保持正确AccountAttributes

表格

属性: Attribute_Id(PK)

AccountAttribute: AccountAttribute_Id(PK); Attribute_Id(FK); CustomerProfile_Id(FK)

CustomerProfile: CustomerProfile_Id(PK)

Attribute / AccountAttribute层次结构的映射。

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" >
  <class name="Attribute, CustomerProfile" lazy="false">

    <id name="Identifier" column="Attribute_Id" access="field.camelcase">
      <generator class="identity"/>
    </id>

    <joined-subclass name="AccountAttribute, CustomerProfile" table="AccountAttribute" lazy="false">
      <key column="Attribute_Id" />
      <property name="ValueText" column="Value_Txt" access="nosetter.camelcase" />
    </joined-subclass>

  </class>
</hibernate-mapping>

帐户对象的映射

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" >
  <class name="Account, CustomerProfile" lazy="false">

    <id name="Identifier" column="Account_Id" access="field.camelcase">
      <generator class="identity"/>
    </id>

    <!-- How do I map to the AccountAttributes table here to get the correct set? -->
    <bag name="AccountAttributes" access="field.camelcase" table="AccountAttribute">
      <key column="Account_Id" />
      <one-to-many class="AccountAttribute, CustomerProfile"/>
    </bag>

  </class>
</hibernate-mapping>

谢谢,

凯尔

1 个答案:

答案 0 :(得分:0)

我认为您的问题是由于您已在表格中为您的子类指定了自己的主键,即AccountAttribute_id中的AccountAttribute

如您所说,您正在使用 table-per-subclass 所有子类表都应该使用超类主键,因此AccountAttribute表应该只有Attribute_id}作为主键,也是返回Attribute表的外键。

完成这些更改后,您的映射应该可以正常运行,因为它使用了正确的<key />


参考文献: