0
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,我想执行一个 session.Save(B) 并保存所有内容。

您对此事的帮助将不胜感激。

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

4

2 回答 2

1

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

映射典型的一对多关系,使得多方是反方。使用该映射,有必要将包含的对象添加到集合(一侧)并在对象的一侧设置对包含对象的引用。

于 2012-01-23T12:54:56.667 回答
0

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

(复制自我的评论)

“通过将包从 B 移动到具体的子类映射,我在一定程度上解决了这个问题,在我的代码中,B 是一个基子类本身,它有两种不同的实现,显然 Nhibernate 只是忽略了包,因为它位于子类基映射上。 "

于 2012-04-01T06:59:40.810 回答