Посмотрел два интересных видео. Первое про дотнет и про то как там у разработчиков волосы гладкие и шелковистые, а второе про хибернейт и как там все ужасно. Давно хотел сформулировать свое отношение и вот созрело, хоть и немного сумбурно.
На первом проекте мы использовали чистый JDBC, выкладывая данные напрямую в JSP. Через пару лет мы доросли до предварительной выгрузки в POJO и то, только потому, что это было удобно сериализовать в JSON. У нас было несколько проблем:
1. Мы использовали хранимки на PL/SQL и Oracle-специфичную работу с кубами, и не смогли перейти на PostgreSQL, когда пытались уменьшить стоимость продукта.
2. Пул коннектов, который регулярно приходилось подкручивать.
3. Место хранения запросов. Некоторые запросы были настолько огромные, что мы хранили их в отдельных файлах. Многострочных строк в жабе реально не хватало. В итоге логика размазалась между хранимками, файлами и кодом.
Под конец я пытался как-то унифицировать выкладку данных из запроса в POJO, но не преуспел в связи с отсутствием опыта работы с reflection.
JDBC
На первом проекте мы использовали чистый JDBC, выкладывая данные напрямую в JSP. Через пару лет мы доросли до предварительной выгрузки в POJO и то, только потому, что это было удобно сериализовать в JSON. У нас было несколько проблем:
1. Мы использовали хранимки на PL/SQL и Oracle-специфичную работу с кубами, и не смогли перейти на PostgreSQL, когда пытались уменьшить стоимость продукта.
2. Пул коннектов, который регулярно приходилось подкручивать.
3. Место хранения запросов. Некоторые запросы были настолько огромные, что мы хранили их в отдельных файлах. Многострочных строк в жабе реально не хватало. В итоге логика размазалась между хранимками, файлами и кодом.
Под конец я пытался как-то унифицировать выкладку данных из запроса в POJO, но не преуспел в связи с отсутствием опыта работы с reflection.
Django ORM
На втором проекте долго выбирал на чем писать веб часть. Пэхапешный Yii был великолепен, но сам PHP вызывал у меня почти физическое страдание. Решил использовать питоновский Django. У него был простой ORM. Благодаря динамичности он упрощал тривиальные случаи и не препятствовал сложной логике благодаря Manager-ам. Кому было тесно в рамках родного ORM, мог подключить SQLAlchemy.
Единственная проблема, с которой я столкнулся - это отсутствие реверсивной подгрузки. Комментарии к тикету довольно показательны. В рельсах это работало, а в Django положили на проблему большой wontfix.
JPA over Hibernate
Главные аргументы за ORM?
1. Можно не знать SQL? Полный буллшит, абстракция течет из всех щелей.
2. Мы абстрагируемся от базы? Тоже бред, на более-менее сложных запросах мы будем вынуждены писать чистый SQL, а в процессе оптимизации еще и использовать DB-specific оптимизации.
3. Можно не задумываться об управлении объектами? То количество времени, которое мы потратили на борьбу с ленивой инициализацией и закрытими сессиями не поддается подсчету.
4. Перегрузка данных из базы в объекты и назад - это, пожалуй единственное что удалось реализовать. Да и та делается через reflection.
Что мы теряем?
1. Простой и оптимизированный SQL. Выбирается огромный объем данных, отсутствует возможность тонкого управления ленивой инициализацией. Да и сама ленивая инициализация это - костыль.
2. Невозможность поточной выгрузки большого количества объектов, например тысячи точек для построения графиков.
3. Сложные случаи делаются почесыванием правой пяткой за левым ухом, либо плюём и пишем чистый SQL.
Альтернативы для Java
Судя по этой ветке на stackoverflow, единственная серьезная альтернатива гибернейту на Java - MyBatis. Но и он точно так же завалится на сложных случаях. Остальные, типа Ebean в Play! недостаточно взрослые.
Что хочется от идеального ORM
0. Отсутствие ORM.
1. Использование чистого SQL, возможно имеет смысл покрывать тестами для удобства потенциальной миграции
2. Перегрузка данных между объектами и resultset
3. Возможность низкоуровнего доступа к resultset для тонкой работы с данными
4. Поточная работа с resultset, без промежуточного создания кучи объектов
5. Многоэтапная выгрузка объектов из базы и хуки для ленивой подгрузки