Doctrine 2基于双实体复合主键的一对一关联实现问询
复合主键下的一对一关联:可行且需要显式配置JoinColumn
当然可以通过复合主键建立一对一关联!不过你当前的代码还缺少关键的关联配置——必须添加@JoinColumn注解,因为Doctrine无法自动推断复合主键之间的映射关系。
问题分析
你的Header和Detail实体都使用了双字段复合主键,但Detail类里的$header关联没有明确指定主键字段的对应规则,Doctrine不知道UD1/UD2应该关联到Header的哪个字段,所以需要显式配置。
修改后的正确代码
只需要调整Detail类中$header属性的注解,为每个复合主键字段添加对应的@JoinColumn:
class Detail{ /** * * @ORM\Id * @ORM\Column(name="UD1", type="integer", nullable=false) */ protected $key1; /** * * @ORM\Id * @ORM\Column(name="UD2", type="integer", nullable=false) */ protected $key2; /** * @ORM\OneToOne(targetEntity="Header", inversedBy="detail") * @ORM\JoinColumn(name="UD1", referencedColumnName="UH1", nullable=false) * @ORM\JoinColumn(name="UD2", referencedColumnName="UH2", nullable=false) */ protected $header; }
注解说明
name="UD1":指定Detail表中用于关联的字段名referencedColumnName="UH1":指定关联到Header表中的对应主键字段名nullable=false:因为是主键关联,关联字段不能为空,确保数据完整性
Header类的代码不需要修改,它的$detail关联已经通过mappedBy="header"指向了Detail的关联属性。
这样配置后,Doctrine就能正确识别两个实体的复合主键关联,实现一对一的映射关系啦。
内容的提问来源于stack exchange,提问作者Jack Skeletron
相关产品推荐
相关产品推荐

