Проблема с proxi-объектами в ORM Doctrine 2

Всем здравствуйте!

Хочу попросить помощи в вопросе, касающемся работы с ORM Doctrine, так как у самого не получается разобраться в сложившейся ситуации, и в интернете не получается найти решения.

Я разрабатываю сервис на PHP (Symfony Framework), обрабатывающий сообщения из очереди. Каждая итерация по обработке сообщения из очереди имеет следующий жизненный цикл:

  • на основании данных из очереди делается запрос в БД и оттуда извлекаются данные, при этом на основании данных из БД формируются сущности - PHP-объекты, которые имеют связи различного типа: один-к-одному, один-ко-многим, многие-к-одному с другими данными в БД, часть связанных данных тянется явно, часть заменяется заглушками - Proxy-объектами
  • на каждой итерации формируется новый объект, имеющий связи с извлеченными объектами и с объектами, которые заменены Proxy-объектами, то есть не извлечены, но по факту, их полное извлечение и не требуется, так как нам надо только id из Proxi-объекта, чтобы записать его в новую сущность
  • после этого на новом объекте вызывается EntityManager::persist(), затем EntityManager::flush() и на этом итерация обработки сообщения заканчивается

Проблема возникает на второй итерации. Сначала скрипт вылетал на операции EntityManager::flush() с такой ошибкой

Multiple non-persisted new entities were found through the given association graph:
A new entity was found through the relationship XXX that was not configured to cascade persist operations for entity YYY. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @OneToMany(..,cascade={"persist"}).

После того, как я прошелся по классам, описывающим сущности из БД и внес правки, согласно рекомендациям, то есть - добавил в описание связей cascade={"persist"} скрипт начал развалиться на второй итерации с другой ошибкой:

Entity XXX not valid: this value already used

По данной проблеме я ничего внятного в интернете не нашел. Так же я пробовал согласно рекомендации из первой ошибки, вместо того, чтобы прописывать cascade={"persist"} принудительно вызывать EntityManager::persist() на тех объектах, которые указывались в этом сообщении, но на второй итерации все равно получал ошибку:

Entity XXX not valid: ...

Правда вторая часть сообщения была разной. При пошаговой отладке я выяснил, что эти ошибки возникают именно на proxi-объектах, которые Doctrine создает на первой итерации, но почему-то на второй итерации она их не формирует заново под другие объекты, извлеченные из БД Так же на объектах, которые вызывают проблемы пробовал вызывать EntityManager::clear() EntityManager::detach(), EntityManager::refresh(), но это не помогло. Подскажите пожалуйста, есть ли возможность решить эту проблему? Может можно как-то заставить Doctrine чистить принудительно Proxie-объекты или создавать новые при каждом запросе в БД?


Ответы (0 шт):