Изменения

О Java ORM

5444 байта добавлено, 08:12, 19 февраля 2016
Нет описания правки
Плюсы:
* Умеют дохрена всего :)Наиболее «каноничный» Java ORM* В Есть дополнительные фичи — например, в Hibernate есть Envers, из коробки умеющий логгировать историю изменений сущностей в отдельные таблицы* Для получения красивого Fluent API запросов вместо HQL/JPQL-литералов можно подключить [http://www.querydsl.com/ Querydsl]
Минусы:
* Немного монструозны Код не лаконичен. Нужно задавать маппинги, классы сущностей, конструировать запросы либо через строковой HQL/JPQL, либо через многословный Criteria…* Трудно использовать для динамических сущностей (перегружены функционаломобъектов произвольной структуры) — так или иначе нужно конфигурировать маппинг, даже если используется динамическое отображение без классов моделей.* Возможно, не вполне идеальна логика отображения - отображения — конструирование объекта всегда связано с десериализацией, для сохранения ID связанных объектов без самих объектов применяются proxy-классы и ленивая подгрузка (нет возможности одно и то же поле, скажем, person_id, видеть и в виде ID, и в виде объекта)...* HQL/JPQL - JPQL — всё-таки недоразумение. Не могу понять смысл реализации собственного строкового языка запросов - запросов — SQL если уж во что-то заворачивать, то во что-то объектно-структурированное - структурированное — хотя бы в объект типа "запрос" «запрос» с полями tables, where, order by, group by и ти т.п п., но не снова в строковой же литерал!* Объекты запросов есть в виде CriteriaКроме того, но они не очень удобнык нему есть различные [https://virgo47.wordpress.com/2014/10/09/jpa-is-it-worth-it-horror-stories-with-eclipselink-and-hibernate/ претензии].
== [https://github.com/ActiveJpa/activejpa ActiveJPA] ==
Реализация Попытка реализации Active Record поверх JPA. Минусы:* Велосипедик. == [http://www.querydsl.com/ Querydsl] == Типобезопасное (импортирующее схему в Java классы) Fluent API построения SQL-запросов. Плюсы:* API построения запросов довольно удобное.* Универсальный, работает как с JPA, так и с голым SQL. Минусы:* Хоть и может возвращать DTO’шки (кроме обычного Tuple), они не является ActiveRecord’ами, то есть никакой логики их обновления или подгрузки связей нет. То есть, скорее должен рассматриваться как дополнение к мапперу. == [http://www.jooq.org/ jOOQ] == Плюсы:* Легковесный Fluent API + Active Record фреймворк.* Похож на Querydsl, тоже использует кодогенерацию и типобезопасные запросы через Fluent API, однако в дополнение к этому генерирует классы моделей (Active Record) и поддерживает различные [http://www.jooq.org/doc/3.7/manual/sql-execution/fetching/ способы] получения результатов запросов (Record или смапленные). Минусы:* Трудно/криво расширяются сгенерированные классы записей (трудно добавлять в них доменную логику).* Для работы с Oracle нужна платная лицензия — не очень критично, так как для открытых СУБД (MySQL, PostgreSQL и так далее) доступна версия под лицензией Apache 2.0, разрешающей коммерческое использование. Краткий отзыв — см. например http://teonos.com/blog/java/development/2014/11/10/experiences-with-jOOQ.html
== [http://javalite.io/activejdbc ActiveJDBC] ==
== [http://ebean-orm.github.io/ Ebean ORM] ==
По большей части — части похож на JPA, те же яйца, только в профиль. Классы размечаются ровно теми же JPA-аннотациями, а аннотациями… EbeanServer — тот же аналог сессии или persistence manager’аmanager’а… Плюсы:* Наличие Fluent API запросов, отсутствие велосипедных языков типа JPQL* Встроенная поддержка сериализации/десериализации JSON Минусы:* Серьёзные минусы вроде отсутствуют, разве что логика отображения та же, что в JPA == Идея (велосипедик) — PHP-like ORM == Описанное примерно соответствует либо jOOQ, либо Querydsl с дополнительно прикрученной улучшенной логикой Active Record.
Из плюсов можно отметить разве что наличие * Объект «соединение». Умеет делать запросы в синтаксически кратком стиле (возможно, Fluent API ) и возвращать записи в виде чего-то типа Map<String,Object>. Кроме того, является аналогом сессии/persistence manager’а для запросов вместо JPQLмоделей. Из минусов — * Базовый класс модели хранит запись, полученную из БД, в виде такого же объекта Map, не раскладывая её по слухам отсутствует поддержка сортированных one-to-many своим полям. Благодаря этому создание модели максимально легковесно — это просто вызов конструктора, который делает 1 действие — сохраняет к себе этот Map.* Все вычислимые значения — например, загружаемые ассоциации — хранятся в ещё одном Map’е. Есть общие геттер и manyсеттер, работающие по названию поля и возвращающие, кэширующие и вычисляющие дополнительные значения.* В модели есть ссылка на «грязную»/«чистую» копию и флаг, какой является текущая. Как только кто-toто начинает модифицировать модель — объект создаёт свою копию, а сам становится «грязным».* Логика сохранения в БД также живёт в модели, в виде одного метода типа save(), или, возможно, saveAll(), если в основу класть массовые операции. Это похоже на стиль ActiveRecord, с той только разницей, что в модель всё-many коллекцийтаки нужно передавать объект «соединение».* В модели есть ссылка на resultset, частью которого она является — это позволяет подгружать связи массово.* Круче всего, если класс модели не абстрактный и позволяет с собой работать вообще без создания дочерних классов.