学说#34;通过这种关系找到了一个新的实体。错误

时间:2015-05-27 01:45:03

标签: symfony doctrine-orm doctrine

首先,我想说我已经阅读了所有文档并在发布此问题之前搜索了这些内容。我知道那个错误意味着什么(关系中的非持久化实体)

我认为我不应该得到这个错误。

我有 OneToMany Bi-Directional 关系如下:

Class Channel
{
    /** 
    * @ORM\OneToMany(targetEntity="Step", mappedBy="channel", cascade={"all"}, orphanRemoval=true)
    * @ORM\OrderBy({"sequence" = "ASC"})
    */
    protected $steps;
}

Class Step
{
    /** 
    * @ORM\ManyToOne(targetEntity="Channel", inversedBy="steps")
    */
    protected $channel;
}

一个Channel可以有多个Step,而拥有方可以Channel。我从Doctrine 2.4 升级到 2.5 后,我收到此错误:

  

Doctrine \ ORM \ ORMInvalidArgumentException:找到了一个新实体   通过关系&Company; MyBundle \ Entity \ Step#channel'那   未配置为级联实体

的持久操作

为什么从反面找到新的关系?这是我的代码:

$channel = new Channel();
$step = new Step();
$channel->addStep($step);
$em->persist($channel);
$em->flush();

谢谢!

2 个答案:

答案 0 :(得分:9)

你是对的:Doctrine只关注对拥有方的改变,但你错了:拥有你的关系的一方是Step,而不是Channel

为什么步入拥有方?因为是具有外键的实体。即使是Doctrine文档也告诉你

  

拥有方必须使用OneToOne的inversedBy属性,   ManyToOne,或ManyToMany映射声明。 inversedBy属性   包含反面的关联字段的名称。

可能的解决方案:

  • 尝试通过将cascade={"all"}放入步骤实体来反转级联操作(您确定 所有 是正确的选择吗?)

  • 明确地坚持两个实体:

    $channel = new Channel();
    $step = new Step();
    $channel->addStep($step);
    $em->persist($channel);
    $em->persist($step);
    $em->flush();
    

    here你可以阅读为什么这里提供的第二种方式也很好

答案 1 :(得分:1)

您尝试保留$channel,但内部有Step个实体。因此,在Doctrine中,您现在有2个排队等待插入的实体。然后,Doctrine命令实体的顺序首先是Step,因为它有channel_id外键(现在为空)。 Doctrine尝试坚持这个实体,当它理解channel_id为空时,它会看到持久化的级联规则。它没有看到任何级联规则并且抛出了这个例外。