Php 在preFlush处理程序中持久化新的关联实体(无限递归)
我已经为给定的实体Php 在preFlush处理程序中持久化新的关联实体(无限递归),php,doctrine-orm,Php,Doctrine Orm,我已经为给定的实体Foo创建了一个实体侦听器,它侦听preFlush事件。每当更新或创建Foo实体时,我想创建一个新的Bar实体。 我的问题是,computeChangeSets()再次触发preFlush事件,导致无休止的循环。有人有解决方案或替代方法来处理这个用例吗 class SomeListener { /** * @ORM\preFlush */ public function onPreFlush(Foo $foo, PreFlushEventAr
Foo
创建了一个实体侦听器,它侦听preFlush
事件。每当更新或创建Foo
实体时,我想创建一个新的Bar
实体。
我的问题是,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
}
}
在计算更改集之前调度
PreFlush
事件
换句话说:这里不需要调用重新计算SingleEntityChangeSet()
和computeChangeSets()
。删除这些,你的听众应该工作良好
PS:
computeChangeSets()
将计算所有更改集,因此您无需同时调用recomputeSingleEntityChangeSet()
。谢谢您的回答。我很确定我已经尝试过了,但是我的实体没有持久化到数据库。关联被设置为“级联持续”。我不在atm机上工作,明天我试试你的建议。