这是我的情况: 框架交响曲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)保留这些实体,并尽可能使用一种形式。