创建Interview与Question一对多关联时遇ID生成策略问题求助
问题排查与解决方案
先梳理下你遇到的两个核心问题:标识符生成策略的冲突,以及一对多关联的映射错误,咱们逐个解决:
1. 标识符生成策略矛盾
你提到实体的标识符生成策略要求在调用EntityManager#persist()之前手动填充ID字段,但你的代码里给$id标注了@ORM\GeneratedValue(strategy="AUTO")——这个注解是让ORM自动帮你生成ID值,和手动填充ID的要求完全冲突,这是触发错误的核心原因。
修复方式:
把@ORM\GeneratedValue注解去掉,确保$id属性的定义完整:
/** * @ORM\Column(name="id", type="integer") * @ORM\Id */ private $id;
之后在调用persist()之前,你需要手动给Interview实例的id赋值,比如:
$interview = new Interview(); $interview->setId(123); // 手动设置ID值 $entityManager->persist($interview); $entityManager->flush();
2. 一对多关联映射错误
你的@OneToMany注解里mappedBy="question"明显不对:mappedBy的值应该是关联的Question实体中指向Interview的属性名,而不是"question"。
假设你的Question类里有一个指向Interview的多对一关联,比如:
class Question { /** * @ORM\ManyToOne(targetEntity="Interview", inversedBy="questions") * @ORM\JoinColumn(name="interview_id", referencedColumnName="id") */ private $interview; // 这里的属性名是interview }
那Interview类里的OneToMany注解应该改成:
/** * @OneToMany(targetEntity="Question", mappedBy="interview") */ private $questions;
这样ORM才能正确识别双向关联的对应关系。
3. 补充:__toString方法的潜在问题
你的__toString()方法直接返回$this->id,如果ID还没被赋值(手动设置前),这里会返回null,可能导致后续调用toString时出错,建议加个判断:
public function __toString() { return (string) ($this->id ?? '未设置ID的Interview'); }
内容的提问来源于stack exchange,提问作者deymaz
相关产品推荐
相关产品推荐

