NH冬眠一对多不救孩子
本文关键字:孩子 一对多 冬眠 NH | 更新日期: 2023-09-27 18:21:09
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>
包含 A 的映射
<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修复的一个中发现了一个错误,仍然无法正常工作
除了映射之外,您还需要显示代码。但我注意到您没有设置反向属性。反向属性定义哪一方"拥有"关系。这有点违反直觉,但是您设置了 reverse="true" 来声明另一方拥有该关系。
映射典型的一对多关系,使多边是反边。使用该映射,有必要将包含的对象添加到集合(一侧(,并在多端设置对对象上包含对象的引用。
这不是一个完整的答案,而是解决问题的解决方法。
(摘自我评论(
"我通过将袋子从 B 移动到 A 来解决这个问题 具体的子类映射,在我的代码中 B 本身是一个基子类 有两个不同的实现,显然Nhibernate只是忽略了 袋子,因为它在子类基础映射上。