NHibernate一对多不能拯救孩子

时间:2012-01-22 18:59:30

标签: c# .net nhibernate nhibernate-mapping hbm

class A {..} 
class ContainedA { property of type A and some extra information }
class B : A { collection of type ContainedA  }

你可以说这个想法是能够在几个B中包含A的单个实例,B本身也是A类,只有它可以容纳其他A的

A和B的映射

  <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    namespace="REDACTED"
    assembly= "REDACTED">

    <class name="A" table="A" discriminator-value="1">
        <id name="Id" column="Id" type="int" access="field.camelcase-underscore">
            <generator class="identity" />
        </id>

        <discriminator column="Type" type="int"/>

        <subclass name="B" extends="A" discriminator-value="2">
            <bag name="ContainedAs" cascade="all">
                <key column="AInternalId"/>
                <one-to-many class="ContainedA"/>
            </bag>
        </subclass>

    </class>
</hibernate-mapping>

ContainedA的映射

    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    namespace="REDACTED"
    assembly= "REDACTED">

    <class name="ContainedA" table="ContainedA">
        <id name="Id" type="int" access="field.camelcase-underscore" column="Id">
            <generator class="identity" />
        </id>
        <many-to-one name="A" class="A" column="ContainedAInternalId" cascade="save-update"/>
        <property name="SomeOtherInfoString" column="SomeOtherInfoString" not-null="true"/>
    </class>
</hibernate-mapping>

我的问题是,当我保存容器B时,它不会保存它的ContainedAs集合而不是实际的A包含。 这应该是健壮的,B可以分配现有的和没有现有的As,我想要执行单个会话。保存(B)并保存所有内容。

非常感谢您对此事的帮助。

编辑:在其中一个原始HBM修复它时发现错误,仍然无法正常工作

2 个答案:

答案 0 :(得分:1)

除了映射之外,您还需要显示代码。但我注意到你没有设置逆属性。 inverse属性定义哪一方“拥有”该关系。这有点违反直觉,但你设置inverse =“true”来声明对方拥有这种关系。

映射典型的一对多关系,以便多边是反面。使用该映射,必须将包含的对象添加到集合(一侧)并在多个方面设置对象上的包含对象的引用。

答案 1 :(得分:0)

这不是一个完整的答案,而是解决问题的解决方法。

(复制自我的评论)

  

“通过将行李从B移到a,我有点解决了这个问题   具体的子类映射,在我的代码B中是一个基本子类本身   有两个不同的实现,显然Nhibernate只是被忽略了   因为它是在子类基础映射上的。“