此实体的标识符生成策略要求在调用EntityManager#persist()之前填充ID字段

时间:2018-04-01 12:59:50

标签: symfony doctrine-orm

我想要建立一对多的关系

有课

class Interview {

    /**
     * @OneToMany(targetEntity="Question", mappedBy="question")
     */
    private $questions;

    public function __construct() {
        $this->questions = new ArrayCollection();
    }

    public function __toString() {
        return $this->id;
    }

    /**
     * @return Collection|Question[]
     */
    public function getQuestions() {
        return $this->questions;
    }

    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
    ......
}

另一个

class Question {

    /**
     * @ManyToOne(targetEntity="Interview", inversedBy="interview")
     * @JoinColumn(name="interview_id", referencedColumnName="id")
     */
    private $interview;

    public function getInterview() {
        return $this->interview;
    }

    public function setInterview(Interview $interview) {
        $this->interview = $interview;
        return $this;
    }

    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     */
    private $interview_id;
    ......
}

和所有这些的控制器

if ($form->isSubmitted() && $form->isValid()) {

        $interview = new Interview();
        $question = new Question();

        $em->persist($interview);

        $question->setInterview($interview);
        $question->setTitle($request->get('title'));
        $em->persist($question);
        $em->flush();

        return $this->redirectToRoute('homepage');
}

我收到错误:

  

AppBundle \ Entity \ Question类型的实体缺少已分配的ID   字段'interview_id'。这个标识符生成策略   实体要求之前填充ID字段   调用EntityManager#persist()。如果要自动生成   您需要调整元数据映射   相应

不明白问题是什么以及如何解决。

3 个答案:

答案 0 :(得分:0)

再次强制从数据库加载对象,而不是从身份映射中提供对象。您可以在$em->clear();之后致电$em->persist($interview);,即

$interview = new Interview();
$em->persist($interview);
$em->clear();

答案 1 :(得分:0)

看起来您的项目配置在学说映射部分中有错误。

  

如果您想要自动生成的标识符,则需要   相应地调整元数据映射。

尝试查看完整的doctrine config并使用

进行一些操作
  

auto_mapping:false   以示例或其他方式为真......

同样去this,也许它会有用。

答案 2 :(得分:0)

我确定,为时已晚,但也许其他人会收到此错误:-D 当您的链接实体(此处为Interview实体)为null时,会出现此错误。

当然,您已经实例化了一个Interview的新实例。但是,由于该实体仅包含一个字段(id),因此在持久化该实体之前,其id等于NULL。由于没有其他字段,因此主义认为该实体为NULL。您可以通过在将此实体链接到另一个实体之前调用flush()来解决该问题