Проблема с 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-объекты или создавать новые при каждом запросе в БД?