Hibernate vs JPA vs JDO-плюсы и минусы каждого? [закрытый]


Я знаком с ORM как с концепцией, и я даже использовал nHibernate несколько лет назад для проекта .NET; однако я не следил за темой ORM в Java и не имел возможности использовать ни один из этих инструментов.

но теперь у меня может быть шанс начать использовать некоторые инструменты ORM для одного из наших приложений, в попытке отойти от серии устаревших веб-сервисов.

Мне трудно сказать разницу между спецификацией JPA, что вы получаете с самой библиотекой Hibernate и тем, что может предложить JDO.

Итак, я понимаю, что этот вопрос немного открыт, но я надеялся получить некоторые мнения о:

  • каковы плюсы и минусы каждого?
  • что бы вы предложили для нового проекта?
  • существуют ли определенные условия, когда имело бы смысл использовать один фреймворк против другого?
11 169

11 ответов:

некоторые замечания:

  • JDO и JPA-это спецификации, а не реализации.
  • идея заключается в том, что вы можете поменять реализации JPA, если вы ограничиваете свой код только стандартным JPA. (То же самое для JDO.)
  • Hibernate может использоваться в качестве одной из таких реализаций JPA.
  • тем не менее, Hibernate предоставляет собственный API, с функциями выше и за пределами JPA.

ИМО, я бы рекомендовал Зимовать.


были некоторые комментарии / вопросы о том, что вы должны делать, если вы нужно для использования функций гибернации. Есть много способов взглянуть на это, но мой совет был бы:

  • Если вас не беспокоит перспектива подключения поставщика, то сделайте свой выбор между Hibernate и другими реализациями JPA и JDO в том числе различные расширения конкретного поставщика в вашем решении изготовление.

  • Если вас беспокоит перспектива подключения поставщика, и вы не можете использовать JPA, не прибегая к конкретным расширениям поставщика, то не используйте JPA. (То же самое для JDO).

на самом деле, вам, вероятно, придется пойти на компромисс сколько вы обеспокоены связью поставщика против сколько вам нужны эти расширения для конкретных поставщиков.

есть и другие факторы, например, насколько хорошо вы сотрудники знают соответствующие технологии, сколько будут стоить продукты при лицензировании, и чья история Вы верите в то, что произойдет в будущем для JDO и JPA.

убедитесь, что вы оцениваете реализацию DataNucleus JDO. Мы начали с Hibernate, потому что он оказался настолько популярным, но довольно скоро понял, что это не 100% прозрачное решение для сохранения. Есть слишком много предостережений, и документация полна "если у вас есть эта ситуация, то вы должны написать свой код, как это", что отняло удовольствие от свободного моделирования и кодирования, однако мы хотим. JDO имеет никогда заставил меня настроить мой код или мою модель, чтобы получить его чтобы "работать правильно". Я могу просто проектировать и кодировать простые POJOs, как если бы я собирался использовать их только "в памяти", но я могу сохранять их прозрачно.

другое преимущество JDO / DataNucleus над hibernate заключается в том, что он не имеет всех накладных расходов на отражение времени выполнения и более эффективен в памяти, потому что он использует расширение байтового кода времени сборки (возможно, добавьте 1 сек к вашему времени сборки для большого проекта), а не прокси-сервер времени выполнения hibernate узор.

еще одна вещь, которую вы можете найти раздражает с Hibernate является то, что ссылка у вас есть на то, что вы думаете, это объект... это часто "прокси" для объекта. Без преимущества расширения байтового кода требуется прокси-шаблон, чтобы разрешить загрузку по требованию (т. е. избегать вытягивания всего графа объекта при вытягивании объекта верхнего уровня). Будьте готовы переопределить equals и hashcode, потому что объект, на который вы ссылаетесь, часто является просто прокси для этого объекта.

вот пример разочарований, которые вы получите с Hibernate, что вы не получите с JDO:

http://blog.andrewbeacock.com/2008/08/how-to-implement-hibernate-safe-equals.html
http://burtbeckwith.com/blog/?p=53

Если вам нравится кодирование для "обходных путей", то, конечно, Hibernate для вас. Если вы цените чистую, чистую, объектно-ориентированную, управляемую моделью разработку, где вы тратите все свое время на моделирование, дизайн и кодирование и ничего из этого на уродливые обходные пути затем потратить несколько часов на оценку JDO / DataNucleus. Вложенные часы окупятся в тысячу раз.

Обновление Февраля 2017

уже довольно давно DataNucleus реализует стандарт персистентности JPA в дополнение к стандарту персистентности JDO, поэтому перенос существующих проектов JPA из Hibernate в DataNucleus должен быть очень прямым, и вы можете получить все вышеупомянутые преимущества DataNucleus с очень небольшим изменением кода, если таковые имеются. Таким образом, с точки зрения вопроса, выбор конкретного стандарта, JPA (только RDBMS) vs JDO (RDBMS + No SQL + ODBMSes + others), DataNucleus поддерживает оба, Hibernate ограничивается только JPA.

производительность обновлений Hibernate DB

еще одна проблема, которую следует учитывать при выборе ORM, - это эффективность его механизма грязной проверки , что становится очень важным, когда ему нужно построить SQL для обновления объектов, которые имеют изменяется в текущей транзакции-особенно когда объектов много. Существует подробное техническое описание механизма грязной проверки Hibernate в этом ответе SO: JPA с гибернацией вставить очень медленно

Я недавно оценил и выбрал структуру персистентности для проекта java, и мои выводы следующие:

Я вижу, что поддержка в пользу JDO в первую очередь:

  • вы можете использовать источники данных, отличные от sql, db4o, hbase, ldap, bigtable, couchdb (плагины для cassandra) и т. д.
  • вы можете легко переключиться с sql на источник данных, отличный от sql, и наоборот.
  • нет прокси-объектов и, следовательно, меньше боли с с уважением к реализации hashcode() и equals ()
  • больше POJO и, следовательно, меньше обходных путей требуется
  • поддерживает больше типов отношений и полей

и поддержка в пользу JPA в первую очередь:

  • более популярным
  • jdo мертв
  • не использует расширение байт-кода

Я вижу много сообщений pro-JPA от разработчиков JPA, которые явно не использовали JDO/Datanucleus предлагая слабые аргументы для того, чтобы не использовать JDO.

Я также вижу много сообщений от пользователей JDO, которые перешли на JDO и в результате стали намного счастливее.

в отношении того, что JPA более популярен, кажется, что это отчасти связано с поддержкой поставщиков РСУБД, а не с ее техническим превосходством. (Звучит как VHS / Betamax для меня).

JDO и это эталонная реализация Datanucleus явно не мертв, как показано в принятии Google его для GAE и активная разработка на исходном коде (http://sourceforge.net/projects/datanucleus/).

Я видел ряд жалоб на JDO из-за улучшения байт-кода, но пока нет объяснения, почему это плохо.

на самом деле, в мире, который становится все более и более одержимым решениями NoSQL, JDO (и реализация datanucleus) кажется гораздо более безопасной ставкой.

Я только начал использовать JDO / Datanucleus и настроить его так, чтобы я мог легко переключаться между использование db4o и mysql. Для быстрого развития полезно использовать db4o и не беспокоиться слишком много о схеме БД, а затем, как только схема стабилизируется для развертывания в базе данных. Я также уверен, что позже я мог бы развернуть все/часть своего приложения в GAE или воспользоваться распределенным хранилищем/map-reduce a la hbase /hadoop / cassandra без слишком большого рефакторинга.

Я нашел начальное препятствие для начала работы с Datanucleus немного сложнее - документация на сайте datanucleus немного трудно попасть - учебники не так легко, как хотелось бы. Сказав это, более подробная документация по API и сопоставлению очень хороша, как только вы пройдете начальную кривую обучения.

ответ: это зависит от того, что вы хотите. Я бы предпочел более чистый код, без блокировки поставщика, более ориентированный на pojo, более популярные варианты NoSQL.

Если вы хотите теплое суетливое чувство, что вы делаем то же самое, что и большинство других разработчиков/овец, выбираем JPA/hibernate. Если вы хотите возглавить в своей области, тест-драйв JDO / Datanucleus и сделать свой собственный ум.

что бы вы предложили для нового проекта?

Я бы не предложил ни того, ни другого! Использовать Spring Дао JdbcTemplate вместе с StoredProcedure,RowMapper и .

мой личный опыт работы с Hibernate заключается в том, что время, сэкономленное на фронте, более чем компенсируется бесконечными днями, которые вы потратите на то, чтобы понять и отладить такие проблемы, как неожиданное каскадное поведение обновления.

если вы используете реляционную БД, то чем ближе ваш код к нему, тем больше у вас контроля. Слой DAO Spring позволяет точно контролировать слой отображения, устраняя при этом необходимость в шаблонном коде. Кроме того, он интегрируется в уровень транзакций Spring, что означает, что вы можете очень легко добавить (через AOP) сложное транзакционное поведение без этого вторжения в ваш код (конечно, вы тоже получаете это с помощью Hibernate).

JDO мертв

JDO на самом деле не мертв, поэтому, пожалуйста, проверьте свои факты. JDO 2.2 был выпущен в октябре 2008 года JDO 2.3 находится в стадии разработки.

это разрабатывается открыто, под Apache. Больше релизов, чем у JPA, и его спецификация ORM все еще опережает даже предлагаемые функции JPA2

JDO имеет расширенные функции, чем JPA см. http://db.apache.org/jdo/jdo_v_jpa.html

Я использую JPA (реализация OpenJPA от Apache, которая основана на кодовой базе KODO JDO, которая составляет 5+ лет и очень быстрая/надежная). ИМХО любой, кто говорит вам, чтобы обойти спецификации дает вам плохой совет. Я положил время и был определенно вознагражден. С помощью JDO или JPA вы можете изменить поставщиков с минимальными изменениями (JPA имеет отображение orm, поэтому мы говорим менее чем за день, чтобы, возможно, изменить поставщиков). Если у вас есть 100+ таблиц, как я делаю это огромное. Плюс вы получаете built0in кэширование с помощью кластерных выселений кэша и все это хорошо. SQL / Jdbc отлично подходит для высокопроизводительных запросов, но прозрачная персистентность намного превосходит для написания ваших алгоритмов и процедур ввода данных. У меня есть только около 16 SQL-запросов во всей моей системе (50k+ строк кода).

любой, кто говорит, что JDO мертв, является астротурфингом FUD monger, и они это знают.

JDO жив и здоров. Спецификация по-прежнему более мощная, зрелая и продвинутая, чем гораздо более молодая и ограниченная JPA.

Если вы хотите ограничить себя только тем, что доступно в стандарте JPA, вы можете написать в JPA и использовать DataNucleus как высокопроизводительную, более прозрачную реализацию персистентности, чем другие реализации JPA. Конечно, DataNucleus также реализует стандарт JDO, если вы хотите гибкость и эффективность моделирования, что JDO приносит.

Я сам изучал это и не могу найти сильной разницы между ними. Я думаю, что большой выбор заключается в том, в какой реализации вы используете. Для себя я рассматривал DataNucleus платформа, поскольку это агностическая реализация обоих хранилищ данных.

Я использовал Hibernate (реализация JPA) и JPOX (реализация JDO) в одном проекте. JPOX работал нормально, но столкнулся с ошибками довольно быстро, там, где некоторые функции языка Java 5 он не поддерживал в то время. У него были проблемы с хорошей игрой с транзакциями XA. Я создавал схему базы данных из объектов JDO. Он хотел подключиться к базе данных каждый раз, когда это раздражает, если ваше соединение Oracle не работает.

затем мы перешли к Зимовать. Некоторое время мы играли только с использованием чистого JPA, но нам нужно было использовать некоторые из специфических функций Hibernate для отображения. Выполнение одного и того же кода на нескольких базах данных очень легко. Hibernate, похоже, агрессивно кэширует объекты или просто иногда имеет странное поведение кэширования. Есть несколько конструкций DDL, которые Hibernate не может обрабатывать, и поэтому они определяются в дополнительном файле, который запускается для инициализации базы данных. Когда я столкнулся с проблемой гибернации часто многие люди, которые столкнулись с той же проблемой, что делает поиск решений проще. Наконец, впадают в спячку, кажется, быть хорошо продуманной и надежной.

некоторые другие респонденты предложили просто использовать SQL. Реальный вариант использования убийцы для объектно-реляционного сопоставления-это тестирование и разработка. Базы данных, построенные для обработки больших объемов данных, как правило, дороги и или их трудно установить. Они трудны для тестирования. Есть много в памяти Java базы данных, которые можно использовать для тестирования, но обычно бесполезны для производства. Возможность использования реальной, но ограниченной базы данных повысит производительность разработки и надежность кода.

Я сделал образец веб-приложения в мае 2012 года, который использует JDO 3.0 & DataNucleus 3.0-посмотрите, насколько он чист: https://github.com/TorbenVesterager/BadAssWebApp

ладно, может быть, это немного слишком чисто, потому что я использую POJOs как для базы данных, так и для клиента JSON, но это весело:)

PS: содержит несколько аннотаций SuppressWarnings (разработанных в IntelliJ 11)