首先,我想说我已经阅读了所有文档并在发布此问题之前搜索了这些内容。我知道那个错误意味着什么(关系中的非持久化实体)
我认为我不应该得到这个错误。
我有 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();
谢谢!
答案 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
为空时,它会看到持久化的级联规则。它没有看到任何级联规则并且抛出了这个例外。