Мой вопрос касается технологий ORM и JDBC, по каким критериям вы решили пойти на технологию ORM по сравнению с JDBC и другими способами?
Спасибо.
Мой вопрос касается технологий ORM и JDBC, по каким критериям вы решили пойти на технологию ORM по сравнению с JDBC и другими способами?
Спасибо.
Сложность.
ORM Если ваше приложение управляется доменом, а отношения между объектами сложны или вам нужен этот объект, определяющий, что делает приложение.
JDBC/SQL. Если ваше приложение достаточно просто, чтобы просто представлять данные непосредственно из базы данных или отношения между ними достаточно просты.
В книге "Шаблоны архитектуры корпоративного приложения" Мартина Фаулера гораздо лучше объясняются различия между этими двумя типами:
Смотрите: Модель домена и Транзакция Script
JDBC
Hibernate.
Это также зависит от кривой обучения.
Ebean ORM имеет довольно низкую кривую обучения (простой API, простой язык запросов), если вы достаточно довольны аннотациями JPA для сопоставления ( @Entity, @Table, @OneToMany и т.д.).
Я думаю, вы забыли посмотреть "Функциональное реляционное сопоставление"
Я бы подвел итог, сказав:
Эффективность различных технологий "Реляционное сопоставление" - мобильность: вы гарантируете, что ваше приложение будет работать на большинстве баз данных ACID. В противном случае вы сможете справиться с различиями между различными диалектами SQL при написании запросов SQL вручную.
Конечно, вы можете сдерживать себя стандартом SQL92 (а затем выполнять некоторое функциональное программирование) или вы можете повторно использовать некоторые концепции функционального программирования с фреймами ORM.
Силы ORM создаются поверх объекта сеанса, который может действовать как узкое место:
Тем не менее, его сильные стороны также являются его недостатками:
Сессия должна иметь возможность сравнивать объекты, поэтому вам необходимо реализовать методы equals/hashCode Но равенство объектов должно основываться на "Бизнес-ключах", а не на идентификаторе базы данных (новые транзиторные объекты не имеют идентификатора базы данных!). Однако некоторые овеществленные понятия не имеют делового равенства (например, операция). Общее обходное решение основывается на GUID, которые склонны нарушать администраторы баз данных.
Сессия должна отслеживать изменения связей, но ее правила сопоставления используют использование сборников, непригодных для бизнес-алгоритмов. Иногда вы хотели бы использовать HashMap, но ORM потребует, чтобы ключ был другим "Rich Object Object" вместо другого легкого... Затем вам нужно реализовать равенство объектов на объекте rich domain, действующем как ключ... Но вы не можете, потому что этот объект не имеет аналогов в мире бизнеса. Таким образом, вы возвращаетесь к простому списку, который вы должны выполнять итерации (и возникают проблемы с производительностью)
ORM API иногда непригодны для использования в реальном мире. Например, веб-приложения реального мира пытаются обеспечить изоляцию сеанса, добавив некоторые предложения WHERE при получении данных... Тогда "Session.get(id)" недостаточно, и вам нужно обратиться к более сложному DSL (HSQL, Criteria API) или вернуться к собственному SQL
Объекты базы данных конфликтуют с другими объектами, предназначенными для других фреймворков (например, OXM frameworks = Object/XML Mapping). Например, если ваши службы REST используют библиотеку джексона для сериализации бизнес-объекта. Но этот Джексон точно сопоставляется с Hibernate One. Затем либо вы объедините оба, и сильная связь между вашим API и вашей базой данных появится Или вы должны реализовать перевод, и весь код, который вы сохранили из ORM, потерян там...
С другой стороны, FRM представляет собой компромисс между "Реляционным сопоставлением объектов" (ORM) и собственными SQL-запросами (с JDBC)
Лучший способ объяснить различия между FRM и ORM заключается в принятии подхода DDD.
Он освобождает ограничения, помещенные на сеанс ORM, и большую часть времени полагается на DSL над SQL (так что переносимость не имеет значения) Но, с другой стороны, вы должны изучить детали транзакции, проблемы concurrency
Список лиц = queryFactory.selectFrom(человек).где( person.firstName.eq( "John" ), person.lastName.eq( "Doe" )).fetch();