在对我的映射进行了一些更改之后( 有关原因,请参阅我关于级联删除的其他问题),我尝试插入一个全新的对象及其所有子类。
在此之后出现了另一个问题,即将密钥插入数据库的问题。情况如下:
我有一个带有 2 层子类的对象,都是一个集合。
让我们调用对象 Parent,这个对象有一个子集合,并且这个集合中的每个实体都有自己的实体集合。映射如下。
父母对其的映射<set>
<!--Parent-->
<set name="Collection"
table="Table"
cascade="all-delete-orphan"
batch-size="15"
inverse="true">
<key column="ParentID"/>
<one-to-many class="CollectionObject,CollectionObject-ns"/>
</set
CollectionObject 的映射
<id name="ID" column="ID">
<generator class="native"/>
</id>
<!-- property mappings-->
<property name="ParentID" column="ParentID" not-null="true"/>
<!--collection mapping-->
<set name="Collection"
table="Table"
cascade="all-delete-orphan"
inverse="true"
batch-size="15">
<key column="ChildID"/>
<one-to-many class="CollectionObject,CollectionObject-ns"/>
</set>
第二个集合中对象的映射映射与上述类似。设想的情况是,我保存父级,这将触发子类/集合的保存。
例如,我有 ID = 1 的 Parent,Parent 填充了 1 个集合,并且这个集合有自己的 1 个集合。
所以我保存父级,父级从数据库中获取一个 ID(本机 sql 身份)。现在,第一个集合应该将其 ParentID 属性填充为 Parent 刚从数据库中获得的 ID。并且该集合的集合应该使用 Child 从数据库中获取的 ID 填充其 ChildID,其方式与 Parent 获取其 ID 的方式相同。
现在发生的事情是(我在 NHProf 中检查了创建的 SQL)所有内容都被插入,具有自己的 ID,但是集合没有用其父类的 ID 填充它们的键列。(相反,它只是插入 0)
所以我的问题归结为,我忘记添加到我的映射中导致发生了什么?关键列不做我认为应该做的事吗?
如果我忘记在这里添加任何内容,请说出来。我很乐意提供更多信息。
更新
我认为问题可能与没有<many-to-one>
标签的孩子有关。所以我尝试将其中一个添加到第一个子映射中。我想出了这个
<many-to-one name="ParentID"
class="Parent,Parent-ns"
column="ParentID"
not-null="true"/>
但是,此设置给了我以下错误。
Exception occurred getter of Parent.ParentID
带有内部异常
{"Object does not match target type."}
可悲的是,这个错误并没有让我知道从哪里继续。