将复合键映射到两个外键
Posted
技术标签:
【中文标题】将复合键映射到两个外键【英文标题】:Mapping composite key to two foreign keys 【发布时间】:2012-04-30 18:26:43 【问题描述】:我有以下两个表:
Jobs
--------
JobNo
DivisionID
NCRs
--------
ID
JobNo
SpoilageJobNo
DivisionID
JobNo 和 DivisionID 在 Jobs 表中构成一个复合键(我知道,但不幸的是它必须是一个复合键,因为它实际上是一个从 4 个不同数据库中提取数据的视图),我需要加入这个键到 JobNo 和 SpoilageJobNo 上的 NCRs 表。
我尝试了以下映射:
<class name="Job" table="v_Jobs">
<composite-id name="Key">
<key-property name="JobNo"></key-property>
<key-many-to-one name="Division" class="Division" column="DivisionID"/>
</composite-id>
<bag name="NCRs">
<key>
<column name="JobNo"></column>
<column name="DivisionID"></column>
</key>
<one-to-many class="NCR"/>
</bag>
<bag name="SpoilageNCRs">
<key>
<column name="SpoilageJobNo"></column>
<column name="DivisionID"></column>
</key>
<one-to-many class="NCR"/>
</bag>
</class>
<class name="NCR" table="NCRs">
<id name="ID">
<generator class="identity"></generator>
</id>
<many-to-one name="Division"
class="Division"
column="DivisionID">
</many-to-one>
<many-to-one name="Job"
class="Job"
column="JobNo">
</many-to-one>
<many-to-one name="SpoilageJob"
class="Job"
column="SpoilageJobNo">
</many-to-one>
</class>
但我只是收到错误Foreign key (FK480F1031931B2CA4:NCRs [JobNo])) must have same number of columns as the referenced primary key (v_Jobs [JobNo, DivisionID])
【问题讨论】:
更新中的映射应该会报错,因为 DivisionID 被映射了两次没有? 不,它工作正常。大概是因为 DivisionID 被定义为多对一键中的列,而不是本身的属性?实际上,我在那个 hbm 文件中也有另一个 Division 映射。啊,复合键的乐趣。 :P 尝试插入一个带有引用集的新 NCR 对象,如果它不抛出 IndexOutOfRangeException 我会感到惊讶 啊,是的,你是对的,我在创建/更新 NCR 时确实遇到了这个问题。我刚刚做了一个肮脏的修复,为 JobNo 和 SpoilageJobNo 创建了两个单独的属性映射,并用 insert="false" 和 update="false" 标记了多对一映射。不是很优雅,但很有效。 【参考方案1】:这是 Tom 对他的问题的回答:
啊哈,我想我明白了。我已经用这个更新了我的 NCR 映射:
<many-to-one name="Job" class="Job">
<column name="JobNo"></column>
<column name="DivisionID"></column>
</many-to-one>
<many-to-one name="SpoilageJob" class="Job">
<column name="SpoilageJobNo"></column>
<column name="DivisionID"></column>
</many-to-one>
【讨论】:
以上是关于将复合键映射到两个外键的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate:复合主键 - 外键:如何在两个表之间映射各个字段