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

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

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

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

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

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

person matt b    schedule 09.02.2009    source источник


Ответы (11)


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

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

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


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

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

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

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

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

person toolkit    schedule 09.02.2009
comment
инструментарий, красивый и краткий. Еще один момент, о котором стоит упомянуть, заключается в том, что JPA не мешает при необходимости использовать специфические особенности реализации. Это означает, что JPA позволяет использовать любую функцию Hibernate, когда Hibernate является реализацией. - person topchef; 12.03.2010
comment
В чем заключаются преимущества использования JPA, если мне нужна какая-то конкретная функция из Hibernate? - person Bruno Reis; 15.05.2010
comment
Следует добавить важное замечание: хотя JPA и JDO имеют отличную поддержку для СУБД, JDO не зависит от хранилища данных и поэтому не ограничивается миром СУБД. Учитывая, что в настоящий момент NoSQL набирает обороты, человеку было бы разумно рассмотреть возможность использования стандарта сохраняемости, который позволяет избежать привязки своих приложений к традиционному миру * SQL. Приложения JDO можно легко развернуть вне хранилищ данных СУБД. Полный список поддерживаемых хранилищ данных можно найти по адресу: datanucleus.org/products/accessplatform/datastores. html - person Volksman; 03.08.2010
comment
@Golfman, почему выбирают, основываясь на том, что может случиться? Ничто не помешает вам заняться чем-то еще, если вам когда-нибудь понадобится поддержка NoSQL ... KISS - person TM.; 09.08.2010
comment
@Bruno - когда вы используете части Hibernate, не относящиеся к Hibernate, вы используете JPA. Очевидно, преимущество ограничения себя чистым JPA состоит в том, что вы можете более легко переключиться на другую реализацию JPA. - person Stephen C; 19.09.2010
comment
Как ни странно, преимуществом JDO всегда было то, что он не зависел от хранилища данных, поэтому вы могли переключиться на объектно-ориентированную базу данных. Это случилось? Нет, по множеству очевидных причин. Тот же игрок, стреляйте снова: с JDO вы можете переключиться на базу данных NoSQL. Это случится? Бьюсь об заклад, этого не произойдет, и я не могу дождаться, когда упадет суфле NoSQL. Но, конечно, вы можете переключиться на хранилище данных в виде электронных таблиц, ... - person Pascal Thivent; 03.10.2010
comment
@toolkit, думаете ли вы, что ваши рекомендации изменятся после выхода JPA 2? Сам я им не пользовался, но API критериев типизации выглядит неплохо. - person cliff.meyers; 18.02.2011
comment
@TM - всегда предпочтительнее сохранять простоту, но если вы намекаете, что JDO менее прост, чем JPA ... да? Больше свободы и открытости всегда лучше, зачем отказываться от дополнительной гибкости, которую вы получаете по сути бесплатно (без дополнительной работы)? @Pascal - Да, вы вряд ли замените базу данных завершенного приложения из СУБД на что-то другое. Но зачем ограничивать свой набор навыков и опыта только спецификацией РСУБД, если вы можете изучить спецификацию, которая дает вам больше возможностей для выбора в «следующем большом проекте»? Если у вас есть выбор, в котором вы хотите получить опыт, вы также можете выбрать более гибкий набор навыков. - person Manius; 28.02.2011
comment
@Stephen C - Я думаю, Бруно спрашивал, какие преимущества дает JPA при использовании специфичных для Hibernate функций (поскольку это, как утверждается, было положительным моментом в JPA). Мне кажется, это хороший вопрос, потому что я не могу себе представить никакой выгоды, кроме как обманчиво позволять некоторым поставщикам или библиотекам заявлять, что они реализуют стандарт. Или, лучше сказать, внедрить неполный стандарт? Я имею в виду, да ладно: JPA - хорошая спецификация, потому что, если вы ее используете, вам не нужно ее использовать! ...Что? Использовать спецификацию только ради спецификации - это чушь. - person Manius; 28.02.2011
comment
@Stephen C - В любом случае, я думаю, что понимаю вашу точку зрения, но исходный комментарий, вызвавший вопрос, был просто глупым, как он был поставлен. - person Manius; 28.02.2011
comment
@Crusader Не говоря уже о том, что JDO проще, чем JPA, или наоборот. Я просто имею в виду, что беспокоиться о поддержке NoSQL, когда вам нечего предложить, что она вам может понадобиться, - пустая трата времени. - person TM.; 28.02.2011
comment
JDO все еще существует? Все еще используется для спецификации? - person johnny; 30.04.2014

Убедитесь, что вы оцениваете реализацию 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 + No SQL + ODBMSes + другие), DataNucleus поддерживает оба, Hibernate ограничен только JPA.

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

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

person Volksman    schedule 11.03.2010
comment
И, как мы все знаем, именно благодаря усовершенствованию JDO получил такое массовое распространение! - person Pascal Thivent; 19.03.2010
comment
Широко разрекламированный FUD и астротурфинг, осуществленный ключевыми игроками Hibernate в первые дни по отношению к JDO, являются не чем иным, как нечестным и отвратительным и, без сомнения, в некоторой степени повлияли на принятие JDO. В наши дни разработчики знают, что улучшение байтового кода вообще не проблема, и часто используют его для множества разных целей, кроме сохранения. Новая библиотека улучшения байтового кода ASM настолько молниеносна, что у вас даже нет времени перевести дух, прежде чем это будет сделано. - person Volksman; 19.03.2010
comment
Сбой JDO предсказывался с самого начала (javalobby.org/forums/ thread.jspa? forumID = 46 & threadID = 1326) и до Hibernate, поэтому вы не можете винить в этом Hibernate. Hibernate / Toplink преуспел там, где игроки Sun и JDO (и их OODBMS) потерпели неудачу, потому что в то время они были лучшими ответами, а не из-за маркетинга и FUD. Период. Кого волнует, быстро ли работает ASM сегодня, а не более пяти лет назад, когда требовалось, и JDO просто проиграл битву. JDO концептуально превосходит? Жаль, что он не смог вовремя реализовать победитель (и не вернется из-за JPA). - person Pascal Thivent; 19.03.2010
comment
Чтобы проиллюстрировать мои слова (еще один пост, который иллюстрирует боль, которую люди чувствовали во время разработки, или почему Hibernate выиграл битву): mail-archive.com/[email protected]/. Мне кажется очевидным, что отражение / cglib было практическим ответом на проблемы людей (и людей не волнует, является ли API концептуально лучше, если его сложно использовать), и я не вижу здесь каких-либо ключевых игроков Hibernate, только пользователей . Итак, в конце я задаюсь вопросом, кто на самом деле распространяет FUD ... - person Pascal Thivent; 19.03.2010
comment
Ну, это, конечно, не похоже на старые времена, когда было бы по крайней мере 17 различных сообщений про Hibernate FUD (но только с 3 разных IP-адресов. Подсчитайте, люди =)). - person Volksman; 24.03.2010
comment
и людей не волнует, превосходит ли API концептуально, если его сложно использовать. Похоже, вы никогда не просветили себя, фактически используя JDO, потому что, если бы вы знали, вы бы не сказали, что это больно использовать. После использования Hibernate я переключился на JDO, потому что обнаружил, что API проще в использовании, и обнаружил, что «прозрачная персистентность» JDO гораздо менее сложна, чем то, что предлагало решение Hibernate Reflection / cglib. Вот некоторые подробности для тех, кто хочет отличить FUD от фактов: datanucleus.org/products/accessplatform_2_0/ - person Volksman; 24.03.2010
comment
Вырвать мою фразу из контекста - слабый соус. Я явно имел в виду письмо, указанное как ссылку, и в то время JDO было проблемой (и я сам экспериментировал с этой болью), Hibernate был лучшим ответом, и именно поэтому он захватил рынок , не из-за 17 постов про Hibernate (что за шутка!) и не из-за маркетинга. Не осознавать это смешно (тем более, что вы повторяете себя - да, я читал ваши сообщения о TSS и так далее). И поскольку мои клиенты сейчас используют JPA (они даже не думают о JDO), потому что они хотят использовать широко используемый / поддерживаемый / проверенный поставщик JPA, я тоже. - person Pascal Thivent; 25.03.2010
comment
Боль - вещь очень субъективная: в то время как некоторые люди могли бы посчитать ожидание дополнительных 1-2 секунд после компиляции для процесса улучшения (в наши дни это на порядок быстрее, чем было) болезненным, другие могут увидеть ограничения и ограничения на их проектирование / моделирование и кодирование при использовании решения с сохраняемостью, которое не на 100% прозрачно, более серьезная проблема, в зависимости от выразительности и сложности их модели предметной области, когда требуется больше времени для работы с наложенными ограничениями. Лично мне это показалось более болезненным. Разная боль для разных людей - person Volksman; 02.04.2010
comment
@Golfman, может быть, это просто Кодо, но я действительно ненавижу JDO, как и все мои коллеги. Дошло до того, что половина из них предпочла бы использовать прямой JDBC. И, чтобы быть ясным, никто не ненавидит это из-за лишнего шага компиляции. Они ненавидят это, потому что это больно писать код и мучительно оптимизировать запросы. Просто мой личный опыт. - person TM.; 09.08.2010
comment
Этот ответ требует обновления? - person Koray Tugay; 06.05.2013

Я недавно оценил и выбрал фреймворк персистентности для java-проекта, и мои выводы таковы:

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

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

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

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

Я вижу много сообщений в поддержку 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 / спящий режим. Если вы хотите стать лидером в своей области, протестируйте JDO / Datanucleus и сделайте свой собственный вывод.

person Tom    schedule 27.09.2010
comment
Мне бы очень хотелось, чтобы вы развили свои мысли, а не повторяли вещи, как попугай (да, именно это вы и делаете). Согласно другим вашим сообщениям, у вас нет большого опыта работы с Object Persistence в целом, и я не уверен, что вы когда-либо использовали ни Hibernate, ни JPA, ни JDO. Итак, в конце вы просто превращаете эту тему в отчаянную рекламу, повторно используя другие (иногда предвзятые и недействительные) аргументы. - person Pascal Thivent; 02.10.2010
comment
На самом деле, как я уже сказал, я просто делился своими впечатлениями от того, что обнаружил, пытаясь выбрать решение. Да, я новичок в Java, почему это должно быть так? Вы, с другой стороны, несколько раз публиковали свое мнение о том, что JDO мертв, не предлагая никаких фактов или доказательств, подтверждающих это, и не признавая технические области, в которых JDO явно превосходит. Вы, очевидно, имеете что-то личное против JDO / Datanucleus и используете эти потоки как средство для сохранения своей позиции против JDO. - person Tom; 03.10.2010
comment
Том, просто взгляните на Google Trends или действительно на.com и скажите мне, является ли JDO успешным с точки зрения принятия (принятие - это ИМО, что делает стандарт живым, а не количество версий спецификации). С 2002 года я использовал много ORM, включая Toplink, JDO 1.0, Hibernate и JPA, и мне не жаль говорить, что JDO 1.0 был ужасным опытом, и именно поэтому Hibernate занял рынок постоянства РСУБД. И нравится вам подход Hibernate или нет, стандартизация широко распространенного решения была хорошим шагом для Java EE, и я рад, что это произошло. - person Pascal Thivent; 05.10.2010
comment
Так что да, JPA моложе и имеет меньше (я не отрицаю этого), но я я удовлетворен им для устойчивости СУБД и предпочитаю его API, язык запросов, простоту использования, простоту и т. Д. JDO. И я считаю, что именно это делает JPA успешным, и я не чувствую себя виноватым за то, что написал это. Точно так же вы можете использовать JDO, и у меня нет проблем с людьми, которые держат JDO в режиме искусственного дыхания. Однако я устал от теоретиков заговора, и тем, кто использует SO для рекламы, следует еще раз прочитать FAQ. Лично я не аффилирован, я просто пользователь. - person Pascal Thivent; 05.10.2010
comment
Паскаль - здесь вы загоняете себя в угол. Думаю, вы упускаете суть раздела "Реклама" в FAQ. ОП попросил мнения о 2 технологиях. Он приглашает тех, кто поддерживает любую из сторон, выступить с конструктивной критикой / рекомендациями. Для Энди / Datanucleus и других пользователей JDO выделение положительных моментов JDO и защита от критики - это не больше рекламы, чем рекомендация кого-то еще здесь использовать спящий режим. - person Tom; 05.10.2010
comment
Возможно, вам стоит обратиться к разделу FAQ, в котором написано «Будьте вежливы», поскольку ваши сообщения на эту тему были обвинительными, конфронтационными или откровенно грубыми. Вашим первым был саркастический комментарий по поводу улучшения. Второй; разглагольствования о трудностях ранних внедрений и больше не актуально. В-третьих, это были детские насмешки и оскорбления для тех, кто предпочел бы не использовать СУБД. Четвертым было саркастическое высмеивание человека, который придерживается других взглядов. Пятое - нападение; называя меня попугаем. Считаете ли вы это «хорошим поведением»? - person Tom; 05.10.2010
comment
Если у вас был ужасный опыт работы с JDO, то объясните, что было ужасным, признайте, что это было с более ранней версией, и с тех пор все, возможно, улучшилось. Вы также должны понимать, что потребности других людей могут отличаться от ваших. То, что вас «устраивает» JPA и вы хотите использовать СУБД, не означает, что другие удовлетворены. Может быть, в спешке повысить свою репутацию вы упустили из виду, чем эта репутация может наградить? пс. Как разработчик, вы действительно должны быть заинтересованы в благополучии таких проектов, поскольку именно это стимулирует инновации и снижает привязку к поставщику. - person Tom; 05.10.2010
comment
Это будет мой последний комментарий. 1. Пункт о рекламе не относился конкретно к этому вопросу. 2. Если вы считаете, что высказанные мной мнения неуместны, сообщите о них. Но я полностью предполагаю и не вижу ничего нечестного в том, что я сказал (в отличие от некоторых комментариев, на которые я ответил). 3. Нет, извините, я не собираюсь подводить итоги более 8 лет войны за постоянство, чтобы объяснить, почему я не использую JDO сегодня, это было бы слишком долго. Я имел в виду, что (большинство) пользователей, не только я, довольны хранилищем данных РСУБД (еще один намек - Google, предлагающий платный хостинг SQL). - person Pascal Thivent; 06.10.2010
comment
4. Я не понимаю, какое отношение ко всему этому имеет мое участие в SO. Мне нравится решать проблемы, делиться решениями и т. Д., Но я все еще придерживаюсь мнения. Мне нужно добавить, что репутация не настоящая? 5. У меня нет проблем с конкуренцией (это хорошо для пользователей). Однако меня раздражает Hibernate / JPA / JBoss - злой настрой. Я доволен тем, что они сделали с Java. 6. Я закончил, если вы хотите получить более подробную информацию, есть 7 лет обсуждений, которые стоит прочитать на TSS и по всей сети. - person Pascal Thivent; 06.10.2010
comment
Это будет мой последний ответ :) .. 1. Если не было смысла задавать вопрос, зачем его поднимать? 2. Я никогда не подвергал сомнению вашу честность, я говорил, что вы плохо относились к другим плакатам и противоречили себе. 3. Никто не предлагал вам резюмировать 8+ лет - но подкрепляйте свои утверждения фактами и примерами, а не субъективными утверждениями, которые могут оскорбить. 5. Где в этом посте говорится о том, что hibernate / jpa / jboss - это зло? Я этого не вижу. Я вижу только ваши комментарии против JDO. - person Tom; 08.10.2010
comment
Забавные вещи - Паскаль, похоже, не понимает одной вещи: лидерство в чем-либо на рынке не прекращает рыночной конкуренции. Неважно, превзошла ли JPA исторически JDO, даже если из-за прошлых проблем с JDO. Если JDO лучше сейчас, как кажется, сравнения, то основным фактором, поддерживающим популярность JPA, является сама популярность (и, возможно, некоторые крупные поставщики, если вы согласны с этим рассуждением). В этом случае существует несколько (если таковые имеются) веских причин сказать людям, что JDO мертв, или не использовать JDO. Как и то, что случилось с Apple - приливы могут измениться, если вы не лучший исполнитель. - person Manius; 28.02.2011
comment
Хотелось бы теплого нечеткого ощущения, что мне не придется заново переписывать весь свой код. Тем не менее, ваш пост сначала был информативным, а закончился предвзятостью. - person orbfish; 24.10.2011
comment
JPA может быть более популярным, чем JDO, но это похоже на то, что автомобили Hyundai и Toyota более популярны, чем автомобили Mercedes, Audi, BMW и Volkswagen. Что бы вы предпочли водить? Основное различие здесь в том, что с автомобилями вам придется выложить намного больше денег, чтобы купить хорошо спроектированные, высокопроизводительные, структурно более безопасные и долговечные модели, но с бесплатными реализациями JPA и JDO с открытым исходным кодом вы можете выбрать версия лучшего качества, если вы не зацикливаетесь на покупке самого популярного автомобиля. У некоторых овец проблемы с такими решениями. Я не. - person Volksman; 30.03.2012
comment
Поддержка в пользу JPA заключается в том, что он не использует улучшения байт-кода. Теперь позвольте мне посмотреть ... EclipseLink, OpenJPA, DataNucleus JPA и Hibernate ВСЕ в наши дни используют усовершенствование байткода. Так что это исключено - person Neil Stockton; 02.03.2015

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

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

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

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

person oxbow_lakes    schedule 09.02.2009
comment
это явно выбор антиобъектно-реляционного сопоставления (ORM), обусловленный большим количеством пользователей и кодовой базой, накопленной со времен ODBC (начало 90-х) (читать устаревшие). Нет причин не использовать JDBC (с Spring или без него), если вы не решите перейти к использованию ORM framework. Подумайте о тех людях, которые однажды решили отказаться от FORTRAN и использовать C или Pascal. - person topchef; 10.03.2010
comment
@grigory - я говорю, имея большой опыт траты времени на попытки понять проблемы Hibernate, такие как каскадные обновления / удаления, смехотворно неэффективные структуры запросов и т. д. Решения ORM - это быстрая победа для тех, кто недостаточно разбирается в реляционных базах данных. Таким образом, маловероятно, что одно только знание Hibernate приведет к хорошему конечному продукту. По моему опыту, на протяжении всего жизненного цикла проекта Hibernate (и ORM по отдельности) требует больше времени, чем экономит - person oxbow_lakes; 04.06.2010
comment
жаль, что у вас был такой плохой опыт работы с Hibernate. Я сам из школы тяжелых баз данных / SQL / хранимых процедур / JDBC. Не могу сказать, что я новичок - каждой технологии, указанной выше, еще есть место. Но для универсального трехуровневого приложения Java (независимо от размера) первым выбором является технология ORM, предпочтительно JPA 2. Другие факторы следует рассматривать на основе таких факторов, унаследованный код, интеграция, опыт, тяжелые пакетные требования, режим реального времени. производительность и т. д., которые могут направлять (а могут и не указывать) подход к другому стеку технологий баз данных. - person topchef; 04.06.2010
comment
Я полностью не согласен с приведенным выше определением быстрого выигрыша - просто возьмите Hibernate в действии (stackoverflow.com/questions/96729/) (и это JPA 1, с JPA 2 становится только лучше), чтобы полностью понять мощность и охват этого технология имеет. - person topchef; 04.06.2010
comment
@oxbow_lakes: Я с тобой в этом вопросе. Я разработчик, администратор базы данных, который помогает Hibernate, использующим Java-ребята, устранять неполадки в этом черном ящике. Конечно, Hibernate ускоряет разработку, но вы просто устраняете узкое место. У ORM есть свое место (средство, а не цель), но они уважают СУБД. Имейте в виду, у меня всегда будет работа, если люди захотят использовать ORM ... - person gbn; 24.08.2010
comment
Я поделился тем же опытом, что и @oxbow. У меня был относительно простой граф объектов, который можно было редактировать с помощью графического интерфейса Swing. Иногда это срабатывало, а затем после нескольких незначительных изменений кода переставало работать. Я очень хорошо знаю Java и SQL. Hibernate выдавал вводящие в заблуждение ошибки, а иногда даже вообще съедал исключения. Во время устранения неполадок я читал ужасающие истории о сопоставлениях Many-To-One, удаляющих данные из базы данных. Для меня это слишком страшно. - person User1; 25.01.2011
comment
@oxbow. Я хочу выучить весну. С чего мне начать? - person User1; 25.01.2011
comment
@ User1 - как насчет здесь: static.springsource.org/spring/docs/3.0.x/ - person oxbow_lakes; 25.01.2011
comment
Я провел небольшое исследование, и Spring больше не рекомендует Spring DAO (static.springsource.org/spring/docs/3.0.x/): рекомендуемый стиль интеграции - кодирование DAO на основе простых API Hibernate, JPA и JDO. Старый стиль использования шаблонов Spring DAO больше не рекомендуется; ... Это то, что вы рекомендовали? Если да, то почему они не рекомендуют это? - person User1; 25.01.2011
comment
Не используйте Hibernate для очень сложных структур данных с множеством объединений и каскадов. Я сделал это и увидел проблемы. Однако для простого приложения JPA / Hibernate - безусловно, самый быстрый способ начать работу. Мне никогда не нравилось тратить часы на написание стандартного кода Spring RowMapper. Вот почему мы изобрели компьютеры, чтобы делать это отображение автоматически. Для такого приложения RowMappers - просто благо, если вы работаете по часам. - person Joseph Lust; 17.11.2011
comment
@ User1: я понимаю отрывок, который вы цитируете, немного иначе, чем вы. Они говорят о том, как следует интегрировать ORM (например, использовать шаблон Spring Hibernate или нет). Не следует ли вам использовать ORM или необработанный JDBC. - person Ben G; 15.03.2012
comment
@ User1 - Вы неправильно поняли. В вашей цитате упоминается рекомендуемый стиль интеграции, а в этом ответе рекомендация - вообще не интегрироваться с ORM. - person Dave L.; 08.04.2014

JDO мертв

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

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

person DataNucleus    schedule 21.02.2009
comment
Люди наверняка его используют, о чем свидетельствуют многие пользователи DataNucleus, не говоря уже о Xcalia, Kodo. Вы упускаете основную идею о том, что JDO и JPA не заполняют один и тот же рынок. JPA - это исключительно СУБД. JDO не зависит от хранилища данных и используется для СУБД, но также для LDAP, XML, Excel, OODBM и т. Д. - person DataNucleus; 22.02.2009
comment
Мне нравится фактор, не связанный с СУБД, особенно с ростом популярности решений без СУБД, это большое дело. Это означает, что если JPA не будет развиваться достаточно быстро, наличие более открытой и гибкой альтернативы (JDO) означает, что популярность JPA будет снижаться по необходимости. Не обращайте внимания на технические аргументы, что JDO более полный, лучший, зрелый или что-то еще - это не будет вопросом предпочтений. Логично, что производители СУБД ведут себя подозрительно - дни доминирования на рынке СУБД подходят к концу. - person Manius; 28.02.2011
comment
Мы все еще используем JDO / DataNucleus в 2019 году! Теперь он до версии 5.x и по-прежнему превосходит Hibernate по производительности разработчика и производительности во время выполнения. Недавно мне пришлось проконсультироваться по большому веб-приложению, использующему Hibernate, и я вспомнил о боли, которую я испытал, когда был активным пользователем и промоутером HIbernate много лет назад. Руководитель группы не поверил мне, когда я сказал ей, что ее BLOB-поле всегда с нетерпением получал, даже если был отмечен как ленивый. Полное отсутствие внутренних знаний опытного самопровозглашенного эксперта по Hibernate было, к сожалению, тревожным, но ожидаемым. - person Volksman; 10.11.2019

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

person Sandeep Manne    schedule 10.03.2010
comment
Совершенно верно! Но, кажется, никто этого не знает ... - person marcolopes; 18.08.2012

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

person Community    schedule 16.04.2009

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

person tapi    schedule 09.02.2009
comment
+1 за DataNucleus, а не за ответ. - person WolfmanDragon; 10.02.2009

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

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

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

person Volksman    schedule 11.03.2010
comment
Или вы используете другую (прекрасную) реализацию с гораздо большим и, следовательно, более отзывчивым сообществом. Да, некоторым это тоже небезразлично. - person Pascal Thivent; 18.03.2010
comment
Это хорошее замечание. Когда люди используют эту реализацию, вы ссылаетесь на потребность в большой поддержке и частые объяснения «лучших практических решений» и «как мне заставить ее работать быстрее и использовать меньше памяти» будут наиболее важными =] - person Volksman; 19.03.2010
comment
А вы говорите о FUD ›:) Забавно. - person Pascal Thivent; 19.03.2010
comment
В вашем комментарии, похоже, предполагается, что я не использовал ни Hibernate, ни JDO. - person Volksman; 24.03.2010
comment
В этой ветке, кажется, очень много ссылок от пары людей на то, насколько хорош DataNucleus. Пожалуйста, не используйте это место в качестве рекламной площадки. - person TM.; 09.08.2010
comment
Ничего удивительного со стороны Гольфмана, который снова и снова вставляет одни и те же отчаянные маркетинговые материалы в каждую ветку, связанную с JPA или DataNucleus (что он использует с 1996 года, до it даже существовало!). - person Pascal Thivent; 23.08.2010
comment
Сено, что здесь происходит? - person ; 24.08.2010
comment
Ой! :) Это должен был быть 2006 год! В свободное время все еще отлаживаю машину времени. - person Volksman; 06.09.2010
comment
Гольфман, разве невозможно написать собственный загрузчик классов, улучшающий байкод только перед загрузкой классов. Почему необходимо выполнять расширение байт-кода во время компиляции? - person βξhrαng; 12.02.2011
comment
Улучшение может быть выполнено после компиляции или во время выполнения, в соответствии с документами Datanucleus. - person DataNucleus; 19.07.2011
comment
Я только что нашел интересное сравнение производительности между реализациями JPA (DataNucleus - это реализация как JDO, так и JPA). В то время как Hibernate отлично справляется с 1000 вставками в один плоский файл, DataNucleus действительно выделяется, когда вы сохраняете объекты со связями с другими объектами - вы знаете, вроде как в реальном приложении :) Вот ссылка: s3-eu-west-1.amazonaws.com/presentations2012/ - person Volksman; 05.03.2013

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

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

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

person Sean McCauliff    schedule 10.03.2010
comment
Насколько я могу судить, JPOX сменил название на DataNucleus (и с тех пор у него были релизы). - person Donal Fellows; 14.08.2010
comment
Думаю, вы действительно обнаружите, что в DataNucleus гораздо меньше открытых ошибок, чем в другом программном обеспечении, о котором вы говорите. Думаю, вы также обнаружите, что разработка DataNucleus сокращает количество ошибок быстрее, чем это другое программное обеспечение. - person DataNucleus; 18.12.2010

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

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

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

person Torben Vesterager    schedule 21.11.2012