Nhibernate:如何在同一个班级的两个班级上创建一个<bag>?</bag>

时间:2011-12-14 20:02:20

标签: hibernate nhibernate nhibernate-mapping hibernate-mapping

我有一个名为“评论”的课程/表格

<class name="Comment">
<id name="Id">
  <generator class="guid"/>
</id>
<property name="ReferenceId" index="Comment_ReferenceId_Index" />
<property name="Contents" length="1024" />

我需要在其他几个类(例如合同

)上创建一个评论包
<class name="Contract">
<id name="Id">
  <generator class="guid"/>
</id>
<property name="Status"/>    
<bag name="Comments">
  <key column="ReferenceId" />
  <one-to-many class="Comment" />
</bag>

或申请:

<class name="Application">
<id name="Id">
  <generator class="guid"/>
</id>
<property name="Status" />
<bag name="Comments">
  <key column="ReferenceId" />
  <one-to-many class="Comment" />
</bag>

但是这个映射只给我一个外键,我如何创建集合以对几个类进行注释?

2 个答案:

答案 0 :(得分:1)

答案是:

将外键的名称设置为“none”,然后休眠不会创建FK,但会跟踪引用。

<class name="Contract">
<id name="Id">
  <generator class="guid" />
</id>
<property name="Status" />    
<bag name="Comments">
  <key column="ReferenceId" foreign-key="none"/>
  <one-to-many class="Comment" />
</bag>

答案 1 :(得分:0)

使用此映射,您将获得一个外键,因为您已经以这种方式显式配置它。对于两个父类,<key column="...">ReferenceId列相同,这意味着NHibernate正在尝试为ReferenceIdApplication创建Contract外键,这可以不行。

最简单的方法是为您的键列指定不同的名称,例如ContractIdApplicationId

如果您想要一个ReferenceId列引用ContractApplication,而不是两者,则必须在您的{{1并Contract映射 - see this article