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


174

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

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

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

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

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

Ответы:


112

Некоторые заметки:

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

ИМО, я бы порекомендовал Hibernate.


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

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

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

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

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


8
инструментарий, красивый и короткий. Еще один момент, который стоит упомянуть, заключается в том, что JPA не препятствует использованию специфических функций реализации при необходимости. Это означает, что JPA позволяет использовать любую функцию Hibernate, когда Hibernate является реализацией.
— topchef

1
Каковы будут преимущества использования JPA, если мне понадобится какая-то особая функция из Hibernate?
— Бруно Рейс

22
Важное замечание, которое следует добавить: хотя JPA и JDO отлично поддерживают RDBMS, JDO не зависит от хранилища данных и не ограничивается миром RDBMS. Учитывая тот факт, что в настоящее время NoSQL набирает обороты, было бы разумно рассмотреть возможность использования стандарта постоянства, позволяющего избежать привязки своих приложений к традиционному миру SQL. Приложения JDO могут быть легко развернуты без хранилищ данных RDBMS. Полный список поддерживаемых хранилищ данных можно найти по адресу: datanucleus.org/products/accessplatform/datastores.html
— Volksman,

2
@ Голфман, зачем выбирать, основываясь на том, что может случиться? Ничто не помешает вам заняться чем-то другим позже, если вам когда-нибудь понадобится поддержка NoSQL ... KISS
— TM.

1
@Bruno - при использовании не-Hibernate специфических частей Hibernate, вы которые с помощью JPA. Очевидно, что преимущество ограничения себя чистым JPA состоит в том, что вы можете легче переключаться на другую реализацию JPA.
— Стивен С

69

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

Другое преимущество JDO / DataNucleus по сравнению с гибернацией состоит в том, что он не имеет всех накладных расходов на отражение во время выполнения и более эффективен при использовании памяти, поскольку использует усовершенствование байтового кода времени сборки (возможно, добавьте 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) и JDO (RDBMS + нет SQL + ODBMS + другие), DataNucleus поддерживает оба, Hibernate ограничивается только JPA.

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

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


3
И, как мы все знаем, именно поэтому JDO так широко используется!
— Паскаль Тивент

15
Хорошо разрекламированный FUD и астротурфинг, выполненный ключевыми игроками Hibernate в первые дни в отношении JDO, является не чем иным, как нечестным и отвратительным, и, несомненно, оказал некоторое влияние на принятие JDO. В наши дни разработчики знают, что усовершенствование байт-кода не является проблемой, и часто используют его для многих других целей, помимо сохранения. Новая библиотека улучшения байтового кода ASM настолько молниеносна, что даже у вас нет времени, чтобы перевести дух, прежде чем это будет сделано.
— Volksman

7
Сбой JDO был предсказан с самого начала ( javalobby.org/forums/thread.jspa?forumID=46&threadID=1326 ) и до Hibernate, поэтому вы не можете винить Hibernate в этом. Hibernate / Toplink преуспел там, где игроки Sun и JDO (и их OODBMS) потерпели неудачу, потому что они были лучшими ответами в то время, а не из-за маркетинга и FUD. Период. Кого волнует, что ASM быстро работает сегодня , этого не было 5+ лет назад, когда это было необходимо, и JDO просто проиграл битву. JDO концептуально лучше? Жаль, что не удалось вовремя реализовать победителя (и не вернется из-за JPA).
— Паскаль Тивент

2
Чтобы проиллюстрировать мои слова (еще один пост, иллюстрирующий боль, которую люди испытывали во время разработки или почему Hibernate выиграл битву): mail-archive.com/open-jpa-dev@incubator.apache.org/… . Мне кажется очевидным, что рефлексия / cglib была практическим ответом на проблемы людей (и людей не волнует, если API концептуально лучше, если это неудобно использовать), и я не вижу здесь ключевых игроков Hibernate, только пользователей , Итак, в конце я задаюсь вопросом, кто на самом деле распространяет FUD ...
— Паскаль Тивент

7
Ну, это, конечно, не похоже на старые времена, когда было бы по крайней мере 17 разных постов про Hibernate FUD (но только с 3 разных IP-адресов. Делайте математику =)).
— Volksman

54

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

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

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

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

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

Я вижу много сообщений про 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 или воспользоваться преимуществами распределенного хранилища / преобразования карт по принципу hbase / hadoop / cassandra без слишком большого рефакторинга.

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

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

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


9
На самом деле, как я уже говорил, я просто высказывал свои впечатления о том, что я обнаружил, пытаясь найти решение. Да, я новичок в Java, почему это так? Вы, с другой стороны, несколько раз писали о том, что вы считаете, что JDO мертва, не предлагая никаких фактов или доказательств, подтверждающих это, и не признавая технические области, в которых JDO явно превосходит все. Очевидно, у вас есть что-то личное против JDO / Datanucleus, и вы используете эти темы как средство для сохранения своей позиции против JDO.
— Том

4
Паскаль - вы тут загоняете себя в угол. Я думаю, что вы упускаете из виду раздел Реклама в FAQ. ОП попросил мнения о 2 технологиях. Он призывает тех, кто поддерживает обе стороны, выступить и представить свои конструктивные критические замечания / рекомендации. Для Andy / Datanucleus и других пользователей JDO выделение положительных сторон JDO и защита от критики - это не больше рекламы, чем кто-то другой, кто рекомендует использовать спящий режим.
— Том

5
Возможно, вам стоит обратиться к разделу часто задаваемых вопросов, в котором написано «Будьте милы», поскольку ваши посты на эту тему были обвинительными, конфронтационными или грубыми. Ваш первый был саркастический комментарий об улучшении. Во- вторых, разглагольствует о трудностях ранних реализаций и больше не актуален. В-третьих, по-детски издевались и оскорбляли тех, кто предпочитает не использовать СУБД. Четвертым было насмешливое издевательство над кем-то, кто смотрит на тебя иначе. Пятая была атака; называя меня попугаем. Вы считаете это «Быть ​​милым»?
— Том

3
Если у вас был ужасный опыт работы с JDO, объясните, что было ужасно, признайте, что это было с более ранней версией, и с тех пор все могло быть улучшено. Вы должны также признать, что у других могут быть разные потребности к вам. То, что вы «удовлетворены» JPA и хотите использовать СУРБД, не означает, что другие это делают. Может быть, в спешке повысить свою репутацию вы потеряли из виду, что эта репутация существует для присуждения? пс. Как разработчик, вы действительно должны быть заинтересованы в благополучии таких проектов, поскольку именно они стимулируют инновации и снижают привязанность к поставщикам.
— Том

6
Это будет мой окончательный ответ :) .. 1. Если это не относится к вопросу, зачем поднимать его? 2. Я никогда не ставил под сомнение вашу честность, я говорил, что вы не были добры к другим постерам и противоречили себе. 3. никто не предлагал вам подвести итоги за 8+ лет - но подкрепите свои утверждения фактами и примерами, а не субъективными утверждениями, которые могут оскорбить. 5. Где в этом посте отношение «hibernate / jpa / jboss is evil»? Я не вижу этого. Я вижу только ваши комментарии против JDO.
— Том

40

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

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

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

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


4
Это явно выбор анти-объектно-реляционного отображения (ORM), обусловленный большим количеством пользователей и кодовой базой, накопленной со времен ODBC (в начале 90-х годов) (читай в наследство). Нет никаких причин не использовать JDBC (с Spring или без Spring), если вы не решите продолжить и использовать платформу ORM. Подумайте о тех людях, которые однажды решили отказаться от FORTRAN, чтобы использовать C или Pascal.
— topchef

23
@grigory - я имею большой опыт тратить дни, пытаясь понять проблемы Hibernate, такие как каскадные обновления / удаления, смехотворно неэффективные структуры запросов и т. д. Решения ORM - это «быстрый выигрыш» для тех, кто недостаточно понимает реляционные базы данных. Таким образом, маловероятно, что знание только Hibernate приведет к хорошему конечному продукту. По моему опыту, в течение жизненного цикла проекта Hibernate (и ORM по расширению) стоит больше времени, чем экономит
— oxbow_lakes

8
извините, что у вас был такой плохой опыт работы с Hibernate. Я сам пришел из тяжелой базы данных / SQL / хранимой процедуры / JDBC. Я не могу сказать, что я - новообращенный - у каждой вышеупомянутой технологии есть место. Но для общего назначения 3-уровневое Java-приложение (независимо от его размера) первым выбором является технология ORM - предпочтительно JPA 2. Другие должны рассматриваться на основе таких факторов, как унаследованный код, интеграция, экспертиза, пакетные требования, в режиме реального времени. производительность и т. д., которая может направить (или не направить) подход к другому стеку технологий баз данных.
— topchef

3
Я полностью не согласен с приведенным выше определением «быстрого выигрыша» - просто возьмите Hibernate в действии ( stackoverflow.com/questions/96729/… ) (и это JPA 1, а с JPA 2 он становится только лучше), чтобы полностью понять мощь и охват этой технологии есть.
— topchef

7
Я провел небольшое исследование, и Spring больше не рекомендует Spring DAO ( static.springsource.org/spring/docs/3.0.x/… ): «Рекомендуемый стиль интеграции заключается в кодировании DAO для простых Hibernate, JPA и JDO API. старый стиль использования шаблонов Spring DAO больше не рекомендуется; "... Это то, что вы рекомендовали? Если так, почему они не рекомендуют это?
— User1

23

JDO мертв

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

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


12
Люди наверняка используют его, о чем свидетельствуют многие пользователи DataNucleus, не говоря уже о Xcalia, Kodo. Вы упускаете основную идею, что JDO и JPA не заполняют один и тот же рынок. JPA является исключительно RDBMS. JDO не зависит от хранилища данных и используется для RDBMS, но также для LDAP, XML, Excel, OODBM и т. Д.
— DataNucleus

3
Мне нравится фактор без RDBMS, особенно с ростом популярности решений без RDBMS, это большое дело. Это означает, что если JPA развивается недостаточно быстро, наличие «более открытой» и гибкой альтернативы (JDO) означает, что популярность JPA будет снижаться из-за необходимости. Не берите в голову технические аргументы, что JDO является более полным, превосходным, зрелым или чем-то еще - это не будет вопросом предпочтения . Имеет смысл, что поставщики RDBMS ведут себя подозрительно - дни доминирования RDBMS на рынке могут подходить к концу.
— Маниус

Мы все еще используем JDO / DataNucleus в 2019 году! Теперь он до версии 5.x и все еще опережает Hibernate по производительности для разработчиков и производительности во время выполнения. Недавно мне пришлось проконсультироваться с большим веб-приложением, использующим Hibernate, и мне напомнили о боли, которую я испытывал, когда много лет назад был активным пользователем и промоутером HIbernate. Руководитель группы не поверил мне, когда я сказал ей, что ее поле BLOB всегда охотно доставался, хотя был помечен как ленивый. Полное отсутствие знаний «под капотом» у «опытного» самопровозглашенного эксперта Hibernate было печально, но ожидаемо.
— Volksman


10

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


8

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


6
+1 за DataNucleus, а не за ответ.
— WolfmanDragon

8

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

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

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


1
Или вы используете другую (прекрасную) реализацию с гораздо большим и, следовательно, более отзывчивым сообществом. Да, некоторые люди заботятся об этом тоже.
— Паскаль Тивент

1
А вы говорите о FUD> :) Забавно.
— Паскаль Тивент

2
Ваш комментарий предполагает, что я не использовал ни Hibernate, ни JDO.
— Volksman

2
Похоже, в этой теме очень много ссылок от пары людей о том, насколько хорош DataNucleus. Пожалуйста, не используйте это место в качестве вашей рекламной платформы.
— ТМ.

3
Ничего удивительного в том, что Гольфман многократно вставляет одни и те же отчаянные маркетинговые материалы в каждый поток, включающий JPA или DataNucleus (который он использует с 1996 года , еще до того , как он появился !).
— Паскаль Тивент

2

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

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

Некоторые другие респонденты предложили использовать только SQL. Настоящим убийственным примером использования реляционного отображения объектов является тестирование и разработка. Базы данных, созданные для обработки больших объемов данных, обычно дороги и сложны в установке. Их сложно проверить. Существует множество баз данных Java в памяти, которые можно использовать для тестирования, но обычно они бесполезны для работы. Возможность использовать реальную, но ограниченную базу данных повысит производительность разработки и надежность кода.


1
Насколько я могу судить, JPOX сменил имя на DataNucleus (и с тех пор выпускал его).
— Donal Fellows

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

1

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.