Проблема гибернации: внешний ключ должен иметь то же количество столбцов, что и указанный первичный ключ
Цель: я хочу, чтобы importJobId в ImportJob использовался в качестве внешнего ключа для идентификатора таблицы размещения, так что когда у нас есть importJobId тогда и только тогда, мы можем иметь идентификатор в распределении, так как без 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 Как это настроено прямо сейчас, у меня есть столбец идентификатора в одной таблице, который имеет ссылку на внешний ключ для составного ключа orgId и importJobType, я не уверен, что мы можем сделать это, и внешний столбец с одним ключом связан с составным ключом другой таблицы, но мой вариант использования.
Обновление: 2
Спасибо за потрясающие подробности, это, безусловно, расширит мои знания о реализации внешних ключей, но моя конечная цель - сопоставление между двумя таблицами один к одному, где таблица A имеет составной ключ для идентификации уникальной строки в этой таблице и в таблице B, я хочу иметь первичный ключ, который будет иметь ссылку внешнего ключа на таблицу A, так что если у нас есть запись в таблице A, то такая же запись jobId должна быть в таблице B, теперь я понимаю, что у нас не может быть первичного ключа одного столбца в таблице B, который будет ссылаться на составной ключ в таблице А.
так что в основном я хочу иметь однозначное соответствие между таблицами, где таблица A имеет составной первичный ключ, а таблица B имеет первичный ключ из одного столбца, используя hibernate, что, конечно, вызывает указанную ошибку, и теперь я собираюсь создать составные ключи в таблице. B также, и теперь сделайте ссылку на внешний ключ на таблицу A, я проверю и обновлю свой вопрос позже, еще раз спасибо за подробные данные.