在preFlush处理程序中持久保存新的关联实体(无限递归)

时间:2014-02-07 09:27:37

标签: php doctrine-orm

我为给定的实体Foo创建了一个实体监听器,它监听preFlush事件。每当更新或创建Bar实体时,我都想创建一个新的Foo实体。 我的问题是computeChangeSets()再次触发了preFlush事件,导致无限循环。任何人都有解决方案或替代方法来处理这个用例?

class SomeListener
{
    /**
     * @ORM\preFlush
     */
    public function onPreFlush(Foo $foo, PreFlushEventArgs $eventArgs)
    {
        $em = $eventArgs->getEntityManager();
        $uow = $em->getUnitOfWork();

        $bar = new Bar();
        $bar->setX('test');
        $foo->addBar($bar);

        $em->persist($bar);

        $meta = $em->getClassMetadata(get_class($foo));
        $uow->recomputeSingleEntityChangeSet($meta, $foo);
        $uow->computeChangeSets(); //This line invokes preFlush listener again
    }
}

1 个答案:

答案 0 :(得分:1)

在计算更改集之前调度

换句话说:您拨打PreFlushrecomputeSingleEntityChangeSet()的电话不需要 。删除那些,你的听众应该工作正常!

PS:computeChangeSets()将计算所有更改集,因此您无需同时调用computeChangeSets()