2016-03-09 31 views
0

有兩個實體:沖洗在實體導致無限循環(學說2)

A: which will auto update something on B 
B 

所述的有一個更新前:

@ORM\PreUpdate 
public function asd() 
{ 
    foreach (\Doctrine\Repository\B::getInstance()->findxxxx($sdf) as $x) 
    { 
     $em->remove($x); 
     $em->flush(); ******* 
    } 
} 

我跟蹤的SQL日誌:

Doctrine\Entity\Accommodation.php: 1116 
Doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\Event\ListenersInvoker.php: 102 
Doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php: 1064 
Doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php: 384 
Doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\EntityManager.php: 356 
Doctrine\Entity\Accommodation.php: 1116 
Doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\Event\ListenersInvoker.php: 102 
Doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php: 1064 
Doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php: 384 
Doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\EntityManager.php: 356 
Doctrine\Entity\Accommodation.php: 1116 
Doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\Event\ListenersInvoker.php: 102 
Doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php: 1064 
Doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php: 384 
Doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\EntityManager.php: 356 
Doctrine\Entity\Accommodation.php: 1116 

所以它變成了*******的行導致這個不定式的循環。我在一個交易中。我知道它不多,但可以幫助我嗎?

+2

B是否有一些屬性是A的引用?另外,即使這肯定不是問題的原因,應儘可能地避免在循環內刷新。最後只需要一次刷新,但如果有很多條目,請查看[批處理](http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/batch -processing.html)。 – chalasr

+0

我在交易中。通過檢查 - > getConnection() - > isTransactionActive()並丟失flush()時,它的活動似乎是好的 –

+1

完美!這是非常具體的。 – chalasr

回答

1

您不應該在PreUpdate中使用remove->,這是問題的可能原因。

請參閱documentation on PreUpdate,注意底部「對此事件的限制」部分。

你應該看看使用不同的事件,如onFlush或prePersist。在你的情況下,我會把它寫成event listener,而不是實體方法,因爲你可以訪問工作單元和其他有用的東西。

+0

我在交易中。通過檢查 - > getConnection() - > isTransactionActive()並在其激活似乎沒有問題時丟失flush() –