wickedweasel
@wickedweasel

Как глобально избавиться от PersistentCollection?

Добрый день.
У меня в проекте есть один сложный документ, составленный из нескольких EmbeddedDocument'ов довольно большой вложенности - профиль игрока в RPG-игре. Всего в документе задействовано около 50 классов. Местами используются включение через @EmbedMany, что при гидрации документов даёт PersistentCollection'ы. Почти все классы были автоматически сгенерены thrift-compiler'ом, поэтому добавление к ним методов, которые будут очищать от PersistentCollection, как мне кажется, немного противоестественно. Потом по этим сгенеренным классам были сгенерены doctrine odm mapping'и в виде yaml-файлов.

Задача: загрузить профиль игрока из mongodb, используя doctrine odm, и записать в thrift.

Проблема: pure-php реализация thrift'а справляется с PersistentCollection'ами нормально. Но вот при попытке записи в thrift с использованием TBinaryProtocolAccelerated (и включенного бинарного расширения thrift_protocol.so), запись падает с Exception'ом:
Thrift\Exception\TProtocolException: Attempt to send non-object type as a T_STRUCT


Возможные решения (как мне видится, в порядке приоритета):
  1. Переопределить HydratorFactory своим классом, который не будет заниматься созданием PersistenCollection'ов: www.doctrine-project.org/api/mongodb_odm/1.0/sourc... . Мне не хватает понимания, какие подводные камни при этом могут возникнуть. Не снесет ли крышу всяким UnitOfWork и DocumentManager'ам?
  2. Использовать тот же thrift для десериализации данных из бд, а сами данные хранить в виде длинной бинарной строки. Минус: мне все же хочется удобный доступ к данным в бд. Можно, в принципе, сохранять данные в развернутом виде + в виде бинарной строки, которую использовать для thrift-десериализации, но тогда получается лишний оверхед в хранении и в общении с базой.
  3. Написать рекурсивный walker, который будет все коллекции подменять на их getValues()
  4. Использовать другой odm, например Mandango. Нужно провести эксперимент, может это и сработает. Но трудозатраты на подключение этого всего дела и на написание генератора mapping'ов все равно довольно существенные.


Помогите советом, пожалуйста. Может я чего-то в упор не вижу, и задача решается просто и элегантно?
  • Вопрос задан
  • 306 просмотров
Решения вопроса 1
wickedweasel
@wickedweasel Автор вопроса
В итоге пошёл по третьему пути. Все работает как надо.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
24 апр. 2024, в 20:57
3000 руб./за проект
24 апр. 2024, в 20:35
5000 руб./за проект