目标:我想将 ImportJob 中的 importJobId 作为分配表 id 的外键,这样当我们有 importJobId 时,只有我们可以在分配中有 id,因为没有 Job 就不能有任何分配。
ImportJob 表的复合主键为 [ORGID,IMPORTJOBTYPE] 并尝试使用在休眠中创建外键关系
<id name="id"
column="ID">
<generator class="native"/>
</id>
<many-to-one name="importjobid"
class="com.delta.pdo.admin.ImportJob"
cascade="save-update"/>
在 Allocation.hbm.xml 中无法正常工作,并且收到错误消息:
Foreign key (FKB29B5F7366007086:ALLOCATIONS [importjobid]))
must have same number of columns as the
referenced primary key (IMPORTJOBMANAGMENT [ORGID,IMPORTJOBTYPE])
这是我的 ImportJob.hbm.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.delta.pdo.admin.ImportJob" table="IMPORTJOB" lazy="false">
<!-- we don't cache this since the commissions code is too screwed up to work with -->
<composite-id>
<key-property name="orgId" type="long" column="ORGID"/>
<key-property name="importJobType" type="java.lang.String" column="IMPORTJOBTYPE"/>
</composite-id>
<!-- Make sure importjobid is not-null='true '-->
<property name="importjobid" type="long" column="IMPORTJOBID" />
<property name="allocations" type="boolean" column="ALLOCATIONS" />
</class>
</hibernate-mapping>
以下是供参考的 bean 类:
public class AllocationBean extends WorkbenchBeanBase
{
private static final Logger log = Logger.getLogger(AllocationBean.class);
private Float allocations;
private String importJobType;
private long id;
private long orgId;
}
public class ImportJobManagment implements Serializable
{
private long importjobid;
private long orgId;
private String importJobType;
private boolean allocations = false;
}
getter/setter
为了简单起见,我已经删除了。
更新:1 现在的设置方式,我在一个表中有 id 列,该表具有对 orgId 和 importJobType 的复合键的外键引用,不确定我们是否可以这样做并且将单列外键键控到另一个的复合键表,但这是我的用例。
更新:2
感谢您提供令人敬畏的细节,这肯定会增强我对外键实现的了解,但我的最终目标是在两个表之间进行一对一映射,其中表 A 具有用于识别该表和表 B 中唯一行的复合键,我想有主键,它有对表 A 的外键引用,这样如果我们在表 A 中有条目,那么相同的 jobId 条目应该在表 B 中,现在我明白你的意思是我们不能在表 B 中有单列主键来引用表 A 中的复合键。
所以基本上我希望在表 A 具有复合主键和表 B 具有使用休眠的单列主键的表之间进行一对一映射,这当然会得到提到的错误,所以现在我要在表中创建复合键B 现在也对表 A 进行外键引用,稍后我将用我的发现验证和更新我的问题,再次感谢您的详细输入。