Доктрина 2 Устранить проблему сущностей - PullRequest
2 голосов
/ 06 мая 2011

Я получаю странную ошибку при удалении сущности с помощью диспетчера сущностей. Выдается исключение, говорящее « Новая сущность была найдена через отношение, которое не было настроено для каскадных сохраняющихся операций », но у меня нет новых сущностей. Я думаю, что это может быть ошибкой в ​​Doctrine, но я решил сначала немного спросить, чтобы убедиться, что я не делал ничего плохого, прежде чем заполнять отчет.

Соответствующий код:

<?php
$em = Doctrine\ORM\EntityManager::create(array('driver' => 'pdo_sqlite', 'memory' => true), $config);

$qb = $em
    ->getRepository('Bar')
    ->createQueryBuilder('bar1')
    ->select('bar1, foo1, bar2')
    ->join('bar1.foo', 'foo1')
    ->join('foo1.bar', 'bar2')
;

$qb->getQuery()->getResult();

$bar = $em->getRepository('Bar')->findOneBy(array('id' => 20));

$em->transactional(function($em) use ($bar) {
    $em->remove($bar);
    $em->flush();
});

Если я удаляю $em->transactional, который оборачивает операцию удаления и очистки, удаление работает. Кроме того, если я удаляю $qb->getQuery()->getResult(); для предыдущего запроса, вызов удаления и сброса работает.

Я получаю ошибку:

Fatal error: Uncaught exception 'InvalidArgumentException' with message 'A new entity was found through a relationship that was not configured to cascade persist operations: Bar@0000000049dcca970000000025d8d6f9. Explicitly persist the new entity or configure cascading persist operations on the relationship.' in doctrine2-orm/lib/Doctrine/ORM/UnitOfWork.php:576
Stack trace:
  #0 doctrine2-orm/lib/Doctrine/ORM/UnitOfWork.php(495): Doctrine\ORM\UnitOfWork >computeAssociationChanges(Array, Object(Doctrine\ORM\PersistentCollection))
  #1 doctrine2-orm/lib/Doctrine/ORM/UnitOfWork.php(537): Doctrine\ORM\UnitOfWork->computeChangeSet(Object(Doctrine\ORM\Mapping\ClassMetadata), Object(Foo))
  #2 doctrine2-orm/lib/Doctrine/ORM/UnitOfWork.php(256): Doctrine\ORM\UnitOfWork->computeChangeSets()
  #3 doctrine2-orm/lib/Doctrine/ORM/EntityManager.php(334): Doctrine\ORM\UnitO in doctrine2-orm/lib/Doctrine/ORM/UnitOfWork.php on line 576

Полный рабочий пример можно найти в этом gist .

Ответы [ 2 ]

4 голосов
/ 22 сентября 2011

Я понял это в конце концов после заполнения сообщения об ошибке .

transactional выполняет внутреннюю очистку, и двойная очистка создавала эту проблему. Я не думаю, что двойной флеш должен сломать вещи, но я не стал спорить с этим.

С учетом того, что я не использовал transactional правильно, Doctrine 2 имеет неявные транзакции, и нет необходимости заключать вызовы в базу данных в transactional, за исключением очень специфических случаев.

Из документации Доктрины 2

Явное разграничение транзакций требуется, когда вы хотите включить пользовательские операции DBAL в единицу работы или когда вы хотите использовать некоторые методы API EntityManager, которые требуют активной транзакции. Такие методы вызовут исключение TransactionRequiredException, чтобы проинформировать вас об этом требовании.

2 голосов
/ 10 августа 2011

транзакция () используется для сброса операции. флеш сделал несколько раз повторно

...