Мой личный опыт показывает, что ORM обычно является пустой тратой времени.
Сначала рассмотрим историю, стоящую за этим. Еще в 60-х и начале 70-х у нас были эти СУБД, использующие иерархическую и сетевую модели. Использовать их было немного сложно, так как при их запросе вам приходилось иметь дело со всей механикой поиска: переходите по ссылкам между записями повсюду и разберитесь с ситуацией, когда ссылки не были ссылками, которые вы хотели ( Например, указали в неправильном направлении для вашего конкретного запроса). Итак, Кодд придумал идею реляционной СУБД: укажите отношения между вещами, скажите в своем запросе только то, что вы хотите, и позвольте СУБД разобраться в механике ее получения. Как только у нас было несколько хороших реализаций, ребята из базы данных были в восторге, все переключились на это, и мир был счастлив.
Пока парни из OO не пришли в мир бизнеса.
ОО парни обнаружили это несоответствие импеданса: СУБД, используемые в бизнес-программировании, были реляционными, но внутренне ОО парни хранили вещи со ссылками (ссылками) и находили вещи, выясняя детали, по каким ссылкам они должны были следовать и следуя им. их. Да, это по сути иерархическая или сетевая модель СУБД. Таким образом, они приложили много (часто гениальных) усилий для наложения иерархической / сетевой модели на реляционные базы данных, случайно отбрасывая многие преимущества, предоставляемые нам СУРБД.
Мой совет - изучить реляционную модель, спроектировать свою систему вокруг нее, если она подходит (как это часто бывает), и использовать мощь своей СУБД. Вы избежите несоответствия импеданса, как правило, вам будет легко писать запросы, и вы избежите проблем с производительностью (например, ваш уровень ORM принимает сотни запросов для выполнения того, что он должен делать в одном).
Существует определенное количество «сопоставлений», которые необходимо выполнить, когда дело доходит до обработки результатов запроса, но это будет довольно легко, если вы подумаете об этом правильно: заголовок отношения результата сопоставляется с класс, и каждый кортеж в отношении является объектом. В зависимости от того, какая дополнительная логика вам нужна, может стоить или не стоить определять реальный класс для этого; может быть достаточно просто обработать список хэшей, сгенерированных из результата. Просто пройдите и обработайте список, сделайте то, что вам нужно, и все готово.