Doctrine复合主键作为另一个实体的主键的一部分

时间:2013-09-12 14:07:43

标签: orm doctrine-orm composite-primary-key

我有一个特定情况,其中一个实体的复合主键是另一个实体的主键的一部分。这是专业化的案例,但现在没关系。

我使用Doctrine从数据库生成实体,但是Doctrine不支持复合外键作为主键:

It is not possible to map entity 'XXXXX' with a composite primary key as part of the primary key of another entity 'YYYYYY#id_xxxxx'

有没有人知道这种情况的解决方案?它可以是Doctrine解决方案或编辑模型和数据库结构。

更新1

CREATE TABLE `amandman` (
  `iddokumenta` int(11) NOT NULL,
  `datumdostavljanjaskupstini` date NOT NULL,
  `tekst` text,
  `datumizmene` date DEFAULT NULL,
  `izmenjenitekst` text,
  `iddokumentapredlogazakona` int(11) DEFAULT NULL,
  `datumdostavljanjaskupstinipredlogazakona` date DEFAULT NULL,
  PRIMARY KEY (`iddokumenta`,`datumdostavljanjaskupstini`),
  KEY `iddokumentapredlogazakona_idx`           (`iddokumentapredlogazakona`,`datumdostavljanjaskupstinipredlogazakona`),
  CONSTRAINT `iddokumenta45` FOREIGN KEY (`iddokumenta`, `datumdostavljanjaskupstini`)     REFERENCES `dokument` (`iddokument`, `datumdostavljanjaskupstini`) ON DELETE NO ACTION ON     UPDATE CASCADE,
 CONSTRAINT `iddokumentapredlogazakona` FOREIGN KEY (`iddokumentapredlogazakona`, `datumdostavljanjaskupstinipredlogazakona`) REFERENCES `predlogzakona` (`iddokumenta`, `datumdostavljanjaskupstini`) ON DELETE NO ACTION ON UPDATE CASCADE) 
ENGINE=InnoDB DEFAULT CHARSET=utf8;

这是Doctrine无法生成的数据库实体之一。

1 个答案:

答案 0 :(得分:5)

您遇到此问题,因为复合外键是另一个表的复合主键。这不是一个好的开发实践,这就是为什么它根本没有得到Doctrine的支持,我强烈怀疑它将永远存在。

解决方案1(首选):

将单个自动增量主键添加到EstablecimientosSec。然后,您可以链接到EstablecimientosSec.id

解决方案2:

如果绝对无法更改数据库结构,请不要映射关系。相反,您可以使用复合主键在单独的查询中获取相关的EstablecimientosSec实体。它不是一个完美的解决方案,但它在这些约束下工作。提示:避免将相关对象作为循环的一部分进行查询。