我有以下情况:
我需要基于一对实体创建大量实体(实体 C)
所以我决定做以下事情:
$AEntities = $em->getRepository('MyBundle:EntityA')->findAll();
$DEntity = $em->getRepository('MyBundle:EntityD')->findOneBy($params);
$iterableResult = $em->getRepository('MyBundle:EntityB')
->createQueryBuilder('b')
->getQuery()->iterate();
$batchSize = 50
while (($row = $iterableResult->next()) !== false) {
foreach($AEntities as $AEntity) {
$entity = new Entity\EntityC();
$entity->setEntityD($DEntity);
$entity->setEntityB($row[0]);
$entity->setEntityA($AEntity);
$em->persist($entity);
}
if(($i % $batchSize) == 0){
$em->flush();
$em->clear();
}
$em->detach($row[0]);
$i++;
}
$em->flush();
我按照 doctrine2-batch-processing 的说明进行操作
但是当我执行
$em->detach($row[0]);
并刷新得到错误通过关系找到了新实体...我试过没有
$em->detach($row[0]);
但是这种高内存消耗我需要 : 就是释放每个Entity B的内存,使用后,但同时每次flush或者分组而不是一个一个,清空所有Entity C
最佳答案
调用 clear() on entity manager分离所有对象(默认情况下)。顺便说一句,您可以传递实体名称以分离给定类型的实体:
$em->clear('EntityB');
$em->clear('EntityC');
我认为你试图分离已经分离的实体,因此它被视为新的。
尝试删除
clear()
称呼。您也可以尝试删除 detach()
来电咨询clear()
在选定的实体上。
关于Symfony2 - 学说批处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8540697/