实体

时间:2015-09-07 16:36:33

标签: symfony doctrine-orm persistence

我有这些实体(问题的相关部分):

 /**
 * Criterion
 *
 * @ORM\Table(name="innova_stepcondition_criterion")
 * @ORM\Entity(repositoryClass="Innova\PathBundle\Repository\CriterionRepository")
 */
class Criterion implements \JsonSerializable
{
    /**
     * Criteriagroup
     * @var \Innova\PathBundle\Entity\Criteriagroup
     *
     * @ORM\ManyToOne(targetEntity="Innova\PathBundle\Entity\Criteriagroup", inversedBy="criteria", cascade={"all"})
     * @ORM\JoinColumns({
     *  @ORM\JoinColumn(onDelete="SET NULL")
     * })
     */
    protected $criteriagroup;
}

/**
 * Criteriagroup
 *
 * @ORM\Table(name="innova_stepcondition_criteriagroup")
 * @ORM\Entity(repositoryClass="Innova\PathBundle\Repository\CriteriagroupRepository")
 */
class Criteriagroup implements \JsonSerializable
{
    /**
     * Criteria linked to the criteriagroup
     * @var \Doctrine\Common\Collections\ArrayCollection
     *
     * @ORM\OneToMany(targetEntity="Innova\PathBundle\Entity\Criterion", mappedBy="criteriagroup", indexBy="id", cascade={"persist", "remove"})
     */
    protected $criteria;
}

当我尝试删除条件组时,我想删除附加的条件。我有这个错误:

 An exception occurred while executing 'DELETE FROM innova_stepcondition_criteriagroup WHERE id = ?' with params [1]: SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`claroline_path`.`innova_stepcondition_criteriagroup`, CONSTRAINT `FK_F33A94EA727ACA70` FOREIGN KEY (`parent_id`) REFERENCES `innova_stepcondition_criteriagroup` (`id`))

所以,我已经阅读了this我们的this one之类的帖子,建议的解决方法是使用onDelete =" SET NULL"在ManyToOne方面的joinColumn,我做了。但我仍然得到这个错误。

可能有什么不对? 谢谢

编辑:

@RaulFerriz:谢谢你的回答。如果我尝试修改:使用cascade = {" persist"}而不是标准中的cascade = {" all"},我仍然会遇到相同的错误。

但如果我完全删除Criterion中的级联,我有:

A new entity was found through the relationship \u0027Innova\\PathBundle\\Entity\\Criterion#criteriagroup\u0027 that was not configured to cascade persist operations for entity: Innova\\PathBundle\\Entity\\Criteriagroup@0000000034dfa7b200000000f76198d8. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist  this association in the mapping for example @ManyToOne(..,cascade={\u0022persist\u0022}). If you cannot find out which entity causes the problem implement \u0027Innova\\PathBundle\\Entity\\Criteriagroup#__toString()\u0027 to get a clue` 

这似乎意味着需要cascade = {" persist"}。

我不知道下一步该尝试什么。 我做了一个学说:schema:每次修改后都会更新。

2 个答案:

答案 0 :(得分:3)

您的问题不在您的关系标准组和标准中。

如果检查SQL错误,则失败的约束是针对字段parent_id的。这是您的Criteriagroup / Criteriagroup关系的一部分。

如果其他人需要这个,那么我就把你的错误关系的定义放在这里:

/**
 * Parent criteriagroup
 * @var \Innova\PathBundle\Entity\Criteriagroup
 *
 * @ORM\ManyToOne(targetEntity="Criteriagroup", inversedBy="children", cascade={"all"})
 * @ORM\JoinColumn(name="parent_id", referencedColumnName="id")
 */
protected $parent;

/**
 * Children criteriagroup
 * @var \Doctrine\Common\Collections\ArrayCollection
 *
 * @ORM\OneToMany(targetEntity="Criteriagroup", mappedBy="parent", indexBy="id", cascade={"persist", "remove"})
 * @ORM\OrderBy({"order" = "ASC"})
 */
protected $children;

为了使这项工作,您需要替换:

@ORM\JoinColumn(name="parent_id", referencedColumnName="id")

通过

@ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="CASCADE")

通过添加此项,当您删除CriteriaGroup时,将删除所有子CriteriaGroup。如果您不想删除儿童,只需添加onDelete="SET NULL"

希望它有所帮助。

答案 1 :(得分:0)

正如您已定义实体一样,当您尝试删除"标准"实体Criteriongroup也将被删除。这不是你想要实现的目标。

试试这个

/** * Criterion * * @ORM\Table(name="innova_stepcondition_criterion") * @ORM\Entity(repositoryClass="Innova\PathBundle\Repository\CriterionRepository") */ class Criterion implements \JsonSerializable { /** * Criteriagroup * @var \Innova\PathBundle\Entity\Criteriagroup * * @ORM\ManyToOne(targetEntity="Innova\PathBundle\Entity\Criteriagroup", inversedBy="criteria") * @ORM\JoinColum(referencedColumnName="id") */ protected $criteriagroup; }

而且这个 /** * Criteriagroup * * @ORM\Table(name="innova_stepcondition_criteriagroup") * @ORM\Entity(repositoryClass="Innova\PathBundle\Repository\CriteriagroupRepository") */ class Criteriagroup implements \JsonSerializable { /** * Criteria linked to the criteriagroup * @var \Doctrine\Common\Collections\ArrayCollection * * @ORM\OneToMany(targetEntity="Innova\PathBundle\Entity\Criterion", mappedBy="criteriagroup", indexBy="id", cascade={"persist", "remove"}) */ protected $criteria; }

基本上,将Criterion实体从级联中清除,最多我认为你需要{cascade="persist"}在这个实体上,这意味着:当Criterion持久存在时,还要坚持与之相关的Criteriagroup。