我正在尝试对我的数据库进行一些批量插入。我已经在理论方面阅读了有关它的文章,并希望使用零星的刷新和清除以防止高内存消耗。不幸的是,所有实体在此过程中都会分离,不仅是我插入的实体,还包括与它的关系。
我试图重新合并它们或使用引用代替。在我目前的情况下,我正在使用引用,但仍然收到以下错误消息:
[学说\ ORM \ ORMInvalidArgumentException]
通过这种关系找到了一个新实体 'Strego \ TippBundle \ Entity \ Bet #betRound'未配置为 实体的级联持久化操作:LoadTest GameGroup。至 解决此问题:显式调用EntityManager#persist()on 这个未知的实体或配置级联持久存在此关联 映射例如@ManyToOne(..,cascade = {“persist”})。
相关编码如下:
// BetRound
print(PHP_EOL."Search for BetROund");
$betRounds = $em->getRepository('StregoTippBundle:BetRound')->findAll();
print(PHP_EOL.'found Betrrounds:'.count($betRounds));
$betRound = current($betRounds);
...
// References
$betRoundRef = $em->getReference('Strego\\TippBundle\\Entity\\BetRound', $betRound->getId());
在这里插入:
foreach($gameRefs as $game){
$bet = new GameBet();
$bet->setBetround($betRoundRef);
$bet->setUser($genuser);
$bet->setGame($game);
$bet->setScoreT1($this->getScore());
$bet->setScoreT2($this->getScore());
$bet->recalculatePoints();
$em->persist($bet);
}
if(($i % self::$batchSize) == 0){
$em->persist($userGroup);
$em->persist($mySelf);
$em->flush();
$em->clear();
$em->merge($betRound);
$em->merge($userGroup);
$em->merge($mySelf);
}
我可以在此处找到用于加载此数据的整个Fixture:https://gist.github.com/KeKs0r/a3006768db267311bb35
答案 0 :(得分:1)
调用clear方法时,所有内容都被分离(Detaching entities)。 你需要重新加载每个先前加载的实体(在你的情况下是$ betRoundRef,$ genuser,也可能是$ game)。