О Java ORM — различия между версиями

Материал из YourcmcWiki
Перейти к: навигация, поиск
м
Строка 1: Строка 1:
== JPA: Hibernate, EclipseLink ==
+
== JPA: [http://hibernate.org/orm/ Hibernate], [http://eclipse.org/eclipselink/ EclipseLink] ==
  
 
Плюсы:
 
Плюсы:
* Умеет дохрена всего :)
+
* Умеют дохрена всего :)
* Например, есть Hibernate Envers, из коробки умеющий логгировать историю изменений сущностей в отдельные таблицы
+
* В Hibernate есть Envers, из коробки умеющий логгировать историю изменений сущностей в отдельные таблицы
 +
* Для получения красивого Fluent API запросов вместо HQL/JPQL-литералов можно подключить [http://www.querydsl.com/ Querydsl]
  
 
Минусы:
 
Минусы:
* Несколько монструозны
+
* Немного монструозны (перегружены функционалом).
 +
* Возможно, не вполне идеальна логика отображения - конструирование объекта всегда связано с десериализацией, для сохранения ID связанных объектов без самих объектов применяются proxy-классы и ленивая подгрузка (нет возможности одно и то же поле, скажем, person_id, видеть и в виде ID, и в виде объекта)...
 +
* HQL/JPQL - всё-таки недоразумение. Не могу понять смысл реализации собственного строкового языка запросов - SQL если уж во что-то заворачивать, то во что-то объектно-структурированное - хотя бы в объект типа "запрос" с полями tables, where, order by, group by и т.п., но не снова в строковой же литерал!
 +
* Объекты запросов есть в виде Criteria, но они не очень удобны.
  
 
== [https://github.com/ActiveJpa/activejpa ActiveJPA] ==
 
== [https://github.com/ActiveJpa/activejpa ActiveJPA] ==
Строка 29: Строка 33:
 
== [http://ebean-orm.github.io/ Ebean ORM] ==
 
== [http://ebean-orm.github.io/ Ebean ORM] ==
  
Плюсы:
+
По большей части — похож на JPA, те же яйца, только в профиль. Классы размечаются ровно теми же JPA-аннотациями, а EbeanServer — тот же аналог сессии или persistence manager’а.
* Также довольно близок к Active Record. Проксей, сессий, persistence manager'ов, DAO, репозиториев и attach/detach тоже нет.
+
* Использование JPA-аннотаций для разметки классов (автор считает, что эта часть спецификации JPA очень разумна и скорее всего )
+
* Модель хранит старые ("чистые") значения полей до сохранения
+
* Наличие встроенных хуков для добавления аудита или логгирования истории
+
* Есть Fluent API для запросов
+
* Есть поддержка массовой ленивой загрузки связей
+
  
Минусы:
+
Из плюсов можно отметить разве что наличие Fluent API для запросов вместо JPQL. Из минусов — по слухам отсутствует поддержка сортированных one-to-many и many-to-many коллекций.
* Пока не найдено :))
+

Версия 21:49, 16 февраля 2016

JPA: Hibernate, EclipseLink

Плюсы:

  • Умеют дохрена всего :)
  • В Hibernate есть Envers, из коробки умеющий логгировать историю изменений сущностей в отдельные таблицы
  • Для получения красивого Fluent API запросов вместо HQL/JPQL-литералов можно подключить Querydsl

Минусы:

  • Немного монструозны (перегружены функционалом).
  • Возможно, не вполне идеальна логика отображения - конструирование объекта всегда связано с десериализацией, для сохранения ID связанных объектов без самих объектов применяются proxy-классы и ленивая подгрузка (нет возможности одно и то же поле, скажем, person_id, видеть и в виде ID, и в виде объекта)...
  • HQL/JPQL - всё-таки недоразумение. Не могу понять смысл реализации собственного строкового языка запросов - SQL если уж во что-то заворачивать, то во что-то объектно-структурированное - хотя бы в объект типа "запрос" с полями tables, where, order by, group by и т.п., но не снова в строковой же литерал!
  • Объекты запросов есть в виде Criteria, но они не очень удобны.

ActiveJPA

Реализация Active Record поверх JPA.

ActiveJDBC

Плюсы:

  • Active Record для Java
  • Легковесный:
    • Необязательны геттеры/сеттеры, поля можно читать по именам model.get("поле")
    • Нет ни проксей, ни сессий, ни persistence manager’ов, ни DAO, ни репозиториев, ни «attach/detach», ни собственного языка запросов

Минусы:

  • Неотключаемое автоматическое определение таблиц и типов полей во время выполнения. Также есть автоматическая привязка классов к таблицам по правилам английского языка — извращение, но по крайней мере отключаемое.
  • Отсутствие поддержки нескольких схем (#144).
  • Трудно во время выполнения явно указать соединение БД, с которым должна работать конкретная модель — несколько соединений указывается только на уровне аннотаций во время компиляции, а в рантайме всегда используется текущее «привязанное» к имени соединение.
  • Отсутствие доступа к «старым» («чистым») значениям полей при сохранении модели.
  • Отсутствие поддержки композитных первичных ключей — всегда нужна автоинкрементная колонка «id», даже в таблицах отношений «многие ко многим»

Ebean ORM

По большей части — похож на JPA, те же яйца, только в профиль. Классы размечаются ровно теми же JPA-аннотациями, а EbeanServer — тот же аналог сессии или persistence manager’а.

Из плюсов можно отметить разве что наличие Fluent API для запросов вместо JPQL. Из минусов — по слухам отсутствует поддержка сортированных one-to-many и many-to-many коллекций.