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'ов все равно довольно существенные.


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

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

Похожие вопросы