О Java ORM — различия между версиями
Материал из YourcmcWiki
м |
|||
Строка 1: | Строка 1: | ||
− | == JPA: Hibernate, EclipseLink == | + | == JPA: [http://hibernate.org/orm/ Hibernate], [http://eclipse.org/eclipselink/ EclipseLink] == |
Плюсы: | Плюсы: | ||
− | * | + | * Умеют дохрена всего :) |
− | * | + | * В 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’а. | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | Из плюсов можно отметить разве что наличие 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 коллекций.