教义:一个新的实体通过关系被发现…冲水的时候


Doctrine: A new entity was found through the relationship... when trying to flush

我一直试图抓住这个解决方案一段时间了,但失败了:当我试图在Doctrine 2.3中持久化一个新实体并在之后刷新时,我收到:

临界:Doctrine'ORM'ORMInvalidArgumentException:一个新的实体是通过关系"Task#parentTask"发现了不存在的问题配置为为实体级联持久化操作

我有一个自我引用的实体Task,它看起来像这样:

class Task
{
    /**
     * @Id
     * @Column(type="integer")
     * @GeneratedValue
     */
     private $id;
     /** 
     * @ManyToOne(targetEntity="tasks'classes'Task", inversedBy="childTasks", fetch="LAZY")
     * @JoinColumn(name="parent", referencedColumnName="id")
     */
    private $parentTask;
    /** 
     * @OneToMany(targetEntity="tasks'classes'Task", mappedBy="parentTask", fetch="LAZY")
     */
    private $childTasks;
}

基于这个任务,我现在我正在使用QueryBuilder中内置的查询获取任务:

   function getTasksCreatedByUser($user) 
   {
        $em = $this->db->getEntityManager();
        $qb = $em->createQueryBuilder();
        $query = $qb->select("t")
            ->from("tasks'classes'Task", "t")
            ->where($qb->expr()->andX(
                "t.creator = :creator"
                // plus more conditions here
            ))  
            ->setParameter("creator", $user)
            ->orderBy("t.id", "DESC")
            ->getQuery()
            ;   
        return $query->getResult();
    }   

对于每一个任务,我创建一个新任务,引用它们为$parentTask(代码缩短):

foreach($tasks as $task) {
    $newTask = new 'tasks'classes'Task();
    $newTask->setParentTask($task);
    $db->persist($newTask);
}
class DB
{
    public function persist($entity)
    {
        $this->entityManager->persist($object);
        $this->entityManager->flush();
    }
}

在我的应用程序的其他部分,相同的模式工作得很好,我找不到区别是什么。

你们谁能帮我理解为什么会抛出异常?我阅读了十几个引用相同异常的其他线程,通常情况下,两个对象之间存在某种关系,到目前为止都没有持久;一个是持久化的,另一个不是,这样就会抛出异常。但我不认为这种情况会发生在我身上。

任何帮助都是感激的!

在Task类中尝试此注释。

/** 
 * @OneToMany(targetEntity="tasks'classes'Task", mappedBy="parentTask", cascade={"persist", "remove"}, fetch="LAZY")
 */
private $childTasks;

我找到了解决问题的方法。我在这里解释一下,希望有一天能对别人有所帮助。

我的应用程序有两部分:一部分是我的web界面的REST后端;第二部分提供CLI操作来执行更长的计算。对于这两种情况,我使用相同的代码实例化了Doctrine EntityManager。我将这个EntityManager#1用于访问数据库的多个模型和助手类。

然而,由于我忘记了我已经有一个实例的事实,我在我的CLI代码中创建了第二个entityManager (entityManager #2)来处理CLI特定的DB访问。这导致了这种情况:getTasksCreatedByUser()与EntityManager#1一起工作,但是foreach($tasks as $task)中的部分与EntityManager#2一起工作。

当我删除第二次实例化时,一切都像魅力一样运行。