当一个人有两个父母时如何持久化实体

时间:2019-05-10 07:46:54

标签: symfony doctrine

这是我的情况: 框架交响曲4,使用Doctrine(version)。 我有三个实体:A,B和C。 实体A与B具有OneToMany关系,与C具有OneToMany关系。 实体B与C具有OneToMany关系。 在一个表单中,我有一个关于实体C的collectionForm嵌入在关于实体B的collectionForm中。 表单中添加实体B和C是可选的。 但是,当尝试添加实体C(并因此添加实体B)时,看到实体C有两个父对象(A和B),则该学说无法知道以哪种顺序持久化它们,并给出以下错误:

通过关系'App \ Entity \ EntityC#entityB'找到了一个新实体,该关系未配置为级联实体的持久操作:App \ Entity \ EntityB @ 0000000010cd7f460000000077359844。解决此问题的方法:在此未知实体上显式调用EntityManager#persist()或配置级联,将该关联保留在映射中,例如@ManyToOne(..,cascade = {“ persist”})。如果您找不到导致问题的实体,请实施“ App \ Entity \ EntityB #__ toString()”以获取线索。

在这种情况下,我该如何告诉教义先保留实体A,然后再保留B,然后再保留C?

到目前为止,我已经尝试过删除B和C之间的OneToMany关系,但是没有任何运气,并在实体C中为实体B添加了ManyToOne关系。 我觉得如果我可以绕开B和C之间的这种关系就可以了,但我不知道如何。

EntityA:


class entityA extends BaseEntityA {
    /**
     * @ORM\OneToMany(targetEntity="App\Entity\EntityB", mappedBy="entityA", cascade={"persist"})
     * @ORM\JoinColumn(name="id", referencedColumnName="entityA_id", nullable=false)
     */
    protected $entitiesB;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\EntityC", mappedBy="entityA", cascade={"persist"})
     * @ORM\JoinColumn(name="id", referencedColumnName="entityA_id", nullable=false)
     */
    protected $entitesC;

...

    /**
     * Add EntityB entity to collection (one to many).
     *
     * @param \App\Entity\EntityB $entityB
     *
     * @return \App\Entity\EntityA
     */
    public function addEntityB(\App\Entity\EntityB $entityB)
    {
        $this->entitiesB[] = $entityB;
        $entityB->setEntityA($this);
        return $this;
    }

    /**
     * Add EntityC entity to collection (one to many).
     *
     * @param \App\Entity\EntityC $entityC
     *
     * @return \App\Entity\EntityA
     */
    public function addEntityC(\App\Entity\EntityC $entityC)
    {
        $this->entitiesC[] = $entityC;
        $vehicle->setEntityA($this);
        return $this;
    }

实体B:


class EntityB extends BaseEntityB {
    /**
     * @ORM\OneToMany(targetEntity="App\Entity\EntityC", mappedBy="entityB", cascade={"persist"})
     * @ORM\JoinColumn(name="id", referencedColumnName="entityB_id", nullable=false)
     */
    protected $entitiesC;

...

    /**
     * @param Collection $entitiesC
     *
     * @return $this
     */
    public function setEntityC(Collection $entitiesC)
    {
        $this->entitiesC = $entitiesC;

        return $this;
    }

    /**
     * Add EntityC entity to collection (one to many).
     *
     * @param \App\Entity\EntityC $entityC
     *
     * @return \App\Entity\EntityB
     */
    public function addEntityC(\App\Entity\EntityC $entityC)
    {
        $this->entitiesC[] = $entityC;
        $entityC->setEntityB($this);
        $entityC->setEntityA($this->getEntityA());

        // Things I tried to remove the relationship between B and C
//        $this->getEntityA()->addEntityC($entityC);
//        $entityC->setEntityB($this);
        return $this;
    }

实体C:


class EntityC extends BaseEntityC {

// Somtehing I tried at some point
//    /**
//     * @ORM\ManyToOne(targetEntity="EntityB", inversedBy="entitiesC", cascade={"persist"})
//     * @ORM\JoinColumn(name="entityB_id", referencedColumnName="id")
//     */
//    protected $entityB;

...
}

我想按正确的顺序(从A到B再到C)保留这些实体,并尽可能使用一种形式。

0 个答案:

没有答案