2012-03-16 3 views
1

Доктрина версия 2.1доктрина 2,1 - объект не может быть сохранен

я сохраняющиеся много объектов, поэтому я должен сделать $this->entityManager->clear() после $this->entityManager->flush(), однако это вызывает хорошо известную ошибку:

Exception: "A new entity was found through the relationship 'Entities\A#B' that was not configured to cascade persist operations for entity: Entities\[email protected] Explicitly persist the new entity or configure cascading persist operations on the relationship. If you cannot find out which entity causes the problem implement 'Entities\B#__toString()' to get a clue."

Он работает для первого флеша, но он не работает для всех остальных. Когда я комментирую $this->entityManager->clear();

Вот пример кода:

if ($flushCounter % 50 == 0) { 
    $this->entityManager->flush(); 
    $this->entityManager->clear(); 
    //$this->entityManager->detach($B); <- with these two lines commented I tried to fix the error, but it did not work 
    //$B = $this->entityManager->find(ENTITY_NAMESPACE . "\B", (int) $B_id); 
    } 
    $flushCounter++; 

Повторюсь, что комментирование ясно() функция устраняет проблему, но я не хочу этого делать, если не лучший способ управления память

+0

Кажется, что вы меняете объекты, которые находятся в ассоциациях, но на обратной стороне ассоциации. Поэтому, когда вы пытаетесь сохранить свою сторону, поскольку нет набора 'CASCADE: persist', он выдает ошибку. –

ответ

0

То, что не хватало, сохраняется на $ B после его получения.

if ($flushCounter % 50 == 0) { 
    $this->entityManager->flush(); 
    $this->entityManager->clear(); 
    $B = $this->entityManager->find(ENTITY_NAMESPACE . "\B", (int) $B_id); 
    $this->entityManager->persist($B); 
    } 
    $flushCounter++; 
1

Что помогло мне было ясно только объект, который получал вставленный в огромных количествах (> 500.000), оставляя остальную часть связанных с объектами этого объекта в памяти

if ($repcount++ % 1000 == 0) { 
    $em->flush(); 
    $em->clear('Entity\Class\Using\Memory'); 
} 

Это хотя afaik работает только с версиями доктрины (> 2.2.0) и symfony2 (> 2.1)

Смежные вопросы