NHibernate中的继承和多态如何获得实际的实例

时间:2012-04-18 14:13:27

标签: hibernate nhibernate

就是这种情况。我有4个表和类,Order,OrderItem,Product和Cristal。

Product是Cristal的具体类和基类。我正在测试插入一个Cristal,然后将其作为产品检索,产生一个Cristal istance。到现在为止还挺好。

现在问题。我在“产品”属性中保留包含产品和Cristals实例的订单的订单。当我从数据库中检索Order对象时,OrderItem实例中的Product属性始终是Product实例。哪里必须是Cristal,有一个产品的公共字段加载正确,但很明显,我无法访问特定的Cristal字段。

我该如何解决这个问题?提前谢谢!

产品及其子类Cristal的映射

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
       assembly="MyNamespace"
       namespace="MyNamespace">
  <class name="Product" table="Products">
    <id name="Id" column="id">
      <generator class="guid.comb" />
    </id>
    <property name="Name" column="name" type="string" not-null="true" />
    <property name="Code" column="code" type="string" not-null="true" />

    <union-subclass name="Cristal" table="Cristals">
      <property name="Esf" column="esf" precision="5" scale="3" not-null="true" />
      <property name="Cil" column="cil" precision="5" scale="3" not-null="true" />
      <property name="Diameter" column="diameter" type="int" not-null="true" />
    </union-subclass>
  </class>
</hibernate-mapping>

订单映射

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
               assembly="MyNamespace"
               namespace="MyNamespace">
  <class name="Order" table="Orders">
    <id name="Id" column="id">
      <generator class="guid.comb" />
    </id>
    <property name="Number" column="number" type="int" not-null="true" />
    <set name="Items" cascade="all-delete-orphan" inverse="true">
      <key column="idOrder" not-null="true" />
      <one-to-many class="OrderItem"/>
    </set>
  </class>
</hibernate-mapping>

OrderItem的映射

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
               assembly="MyNamespace"
               namespace="MyNamespace">
  <class name="OrderItem" table="OrderItems">
    <id name="Id" column="id">
      <generator class="guid.comb" />
    </id>

    <property name="Price" column="price" precision="15" scale="3" not-null="true" />
    <many-to-one name="Order" column="idOrder" foreign-key="FK_OrderItems" not-null="true"  />
    <many-to-one name="Product" column="idProduct" foreign-key="FK_ProductOrderItems"  />

   </class>
</hibernate-mapping>

1 个答案:

答案 0 :(得分:1)

自从我使用NHibernate以来已经有一段时间了,但我想我知道问题可能是什么。

由于Product是一个具体的类,NHibernate不会寻找任何Cristals。也就是说,NHibernate不会在连接中包含Cristal。创建一个抽象基类(ProductBase)和两个具体实现,一个用于Product,另一个用于Cristal。