目標:ImportJobにimportJobIdを割り当てテーブルのIDの外部キーとして使用したいので、importJobIdがある場合は、Jobがないと割り当てができないため、割り当てにidを含めることができます。
ImportJobテーブルには[ORGID、IMPORTJOBTYPE]として複合主キーがあり、Hibernateで外部キー関係を作成しようとしています。
<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 現在の設定方法では、orgIdとimportJobTypeの複合キーへの外部キー参照を持つ1つのテーブルにid列がありますが、これが可能かどうかわからず、別の複合キーに外部キーされた単一の列がありますテーブルですが、それが私のユースケースです。
更新:2
すばらしい詳細に感謝します。これにより、外部キーの実装に関する知識が確実に向上しますが、最終的な目標は、2つのテーブル間の1対1のマッピングです。ここで、テーブルAには、そのテーブルとテーブルBの一意の行を識別するための複合キーがあります。テーブルAへの外部キー参照を持つ主キーがあり、テーブルAにエントリがある場合、同じjobIdエントリがテーブルBにあるはずです。ここで、テーブルBに単一列の主キーを参照することはできないという点がわかります。表Aの複合キー。
したがって、基本的に、テーブルAに複合主キーがあり、テーブルBに休止状態を使用する単一列の主キーがあるテーブル間で1対1のマッピングが必要です。これはもちろん上記のエラーが発生するため、テーブルに複合キーを作成します。 Bもまた、テーブルAへの外部キー参照を作成します。詳細な入力に感謝します。後で、調査結果を使用して質問を検証および更新します。