В чем разница между JPA и Hibernate?

636

Я понимаю, что JPA 2 является спецификацией, а Hibernate - инструментом для ORM. Кроме того, я понимаю, что Hibernate имеет больше возможностей, чем JPA 2. Но с практической точки зрения, какая разница?

У меня есть опыт использования iBatis, и теперь я пытаюсь изучить Hibernate или JPA2. Я взял книгу Pro JPA2 и продолжает ссылаться на "поставщика JPA". Например:

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

Это меня смущает, поэтому у меня есть несколько вопросов:

  • Используя только JPA2, я могу получить данные из БД, просто аннотируя мои POJO
  • Предполагается ли, что JPA2 используется с "провайдером JPA", например, TopLink или Hibernate? Если да, то какое преимущество использования JPA2 + Hibernate по сравнению с Hibernate в одиночку?
  • Вы можете порекомендовать хорошую практическую книгу JPA2. "Pro ​​JPA2" больше похож на библию и ссылку на JPA2 (она не попадает в запросы до более поздней половины книги). Есть ли книга, которая использует подход к решению проблемы/решения для JPA2?
  • 2
    Вопрос о «разнице между JPA и Hibernate» неверен. Битва Hibernate против JPA бессмысленна. Рекомендуется использовать любую реализацию JPA с JPA API, чтобы избежать реализации различных ORM.
  • 18
    @ Berguiga.M.Amine, если мы уже знали, что этот вопрос неверен. Нам больше не нужно спрашивать. Я тоже интересуюсь этой темой.
Показать ещё 2 комментария
Теги:
hibernate
orm
jpa
java-ee

22 ответа

716

Как вы заявляете, JPA - это просто спецификация, что означает, что реализация не выполняется. Вы можете аннотировать свои классы столько, сколько хотите, с аннотациями JPA, однако без реализации ничего не произойдет. Подумайте о JPA как о принципах, которым необходимо следовать, или о интерфейсе, а реализация Hibernate JPA - это код, который соответствует API, как определено спецификацией JPA, и предоставляет функции под капотом.

Когда вы используете Hibernate с JPA, вы фактически используете реализацию JPA Hibernate. Преимущество этого заключается в том, что вы можете поменять реализацию Hibernate JPA для другой реализации спецификации JPA. Когда вы используете прямой Hibernate, вы блокируете реализацию, потому что другие ORM могут использовать разные методы/конфигурации и аннотации, поэтому вы не можете просто переключиться на другую ORM.

Для более подробного описания прочитайте мою запись .

  • 5
    Итак, когда вы используете Hibernate с JPA, аннотации {java.persistence} будут работать или вам придется использовать аннотации {org.hibernate}?
  • 0
    «имеется в виду, что реализации нет», но есть конкретные классы, поэтому мы можем javax.persistence.entityManager.persist
Показать ещё 4 комментария
565

JPA - это танец, Hibernate - танцор.

  • 189
    JPA - это искусство, Hibernate - художник.
  • 2
    эй, но кто-то может использовать javax.persistence.entityManager вместо org.hibernate.session
Показать ещё 18 комментариев
133

Некоторые вещи слишком трудно понять без исторической перспективы языка и понимания JCP.

Часто существуют сторонние компании, которые разрабатывают пакеты, которые выполняют функцию или заполняют пробел, который не является частью официального JDK. По различным причинам эта функция может стать частью Java JDK через JCP (Java Community Process)

Hibernate (в 2003 году) предоставил возможность абстрактного SQL и позволить разработчикам больше думать о сохраняющихся объектах (ORM). Вы уведомляете спящий режим о своих объектах Entity и автоматически генерируете стратегию для их сохранения. Hibernate предоставил реализацию для этого и API для реализации реализации либо через конфигурацию XML, либо аннотации.

В настоящее время основная проблема заключается в том, что ваш код тесно связан с конкретным вендором (Hibernate) для того, что, по мнению многих, должно быть более общим. Отсюда вытекает необходимость в универсальном API-интерфейсе persistence.

В то же время JCP с большим количеством данных от Hibernate и других поставщиков инструментов ORM разрабатывал JSR 220 (Java Specification Request), в результате чего JPA 1.0 (2006) и в конечном итоге JSR 317, который является JPA 2.0 (2009). Это спецификации общего API Java Persistence. API предоставляется в JDK как набор интерфейсов, так что ваши классы могут зависеть от javax.persistence и не беспокоиться о конкретном поставщике, который выполняет работу по сохранению ваших объектов. Это только API, а не реализация. Hibernate теперь становится одним из многих поставщиков, которые реализуют спецификацию JPA 2.0. Вы можете скопировать код JPA и выбрать любой совместимый поставщик ORM, который вам подходит.

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

Источник: http://www.reddit.com/r/java/comments/16ovek/understanding_when_to_use_jpa_vs_hibernate/

  • 2
    Хорошая часть истории. в то время как другие ответы просто повторяют то, что в вопросе.
  • 1
    Спасибо за эту точность. Вы сказали, что JPA был сделан, потому что приложения, которые тесно связаны с Hibernate, требовали абстракции, хорошо. Но разве это не бесконечная проблема? Разве приложение теперь не тесно связано с JPA? Какова реальная выгода здесь? Я уже вижу Hibernate как слой абстракции ...
Показать ещё 1 комментарий
78

JPA - это интерфейс, в то время как Hibernate - это реализация.

Традиционно было много решений Java ORM:

каждая реализация определяет свое собственное определение отображения или клиентский API. Экспертная группа JPA собрала лучшие из всех этих инструментов, и поэтому они создали стандарт Java Persistence API.

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

Стандартная JPA подтолкнула конкуренцию Java ORM к новому уровню, и это может привести только к лучшим реализациям.

Как объяснено в моя книга, Высокая производительность Java Persistence, Hibernate предлагает функции, которые еще не поддерживаются JPA:

Эти дополнительные функции позволяют Hibernate решать многие требования к сохранности, требуемые крупными корпоративными приложениями.

  • 0
    Это хорошо, я не знал о других инструментах ORM ранее
  • 0
    Отличный ответ, и я получаю огромное удовольствие от книги! Спасибо за выпуск этого!
Показать ещё 2 комментария
56

Из Wiki.

Мотивация для создания Java Persistence API

Многие корпоративные Java-разработчики используют легкие постоянные объекты, предоставляемые инфраструктурами с открытым исходным кодом или объектами доступа к данным вместо объекта beans: entity beans, а предприятие beans имеет репутацию слишком тяжелого и сложного, и можно используйте их только на серверах приложений Java EE. Многие из функций сторонних инфраструктур персистентности были включены в API Java Persistence, а с 2006 года такие проекты, как Hibernate (версия 3.2) и версия с открытым исходным кодом TopLink Essentials стали реализациями Java Persistence API.

Как указано на странице JCP, ссылка Eclipse является эталонной реализацией для JPA. Посмотрите этот ответ, чтобы узнать больше об этом.

JPA имеет функции, которые будут использоваться для стандартной структуры ORM. Поскольку JPA является частью спецификации Java EE, вы можете использовать только JPA в проекте и работать с любым серверами, совместимыми с Java EE. Да, эти серверы будут иметь реализации спецификации JPA.

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

  • 3
    Тем не менее, вы можете использовать JPA самостоятельно в проекте. ?? Вы имеете в виду без использования Hibernate, TopLink или любой другой реализации JPA?
  • 2
    @abbas да. Спецификации Java EE используют только JPA. Если вы добавите hibernate, это даст некоторые дополнительные функции.
Показать ещё 5 комментариев
19

Hibernate - поставщик JPA.

Страница JPA Vs Hibernate Кришны Сринивасан говорит:

JPA - это спецификация для доступа, хранения и управления данными между объектами Java и реляционной базой данных. Поскольку определение говорит о его API, это только спецификация. Для API нет реализации. JPA определяет набор правил и рекомендаций для разработки интерфейсов, которые следуют стандарту. Прямо к сути: JPA - это всего лишь руководство по реализации реляционного сопоставления объектов (ORM), и для реализации не существует базового кода. Где, как, Hibernate - это фактическая реализация руководящих принципов JPA. Когда hibernate реализует спецификацию JPA, это будет сертифицировано группой JPA после соблюдения всех стандартов, упомянутых в спецификации. Например, руководящие принципы JPA предоставят информацию об обязательных и дополнительных функциях, которые будут реализованы как часть реализации JPA.

16

JPA - это просто спецификация, которая нуждается в конкретной реализации. default oracle представляет собой "Eclipselink" сейчас. (Toplink пожертвован Oracle для создания Eclipse для объединения с eclipselink)

(Ссылка: http://www.oracle.com/technetwork/middleware/toplink/index-085257.html             http://www.eclipse.org/org/press-release/20080317_Eclipselink.php )

Используя Eclipselink, можно быть уверенным, что код переносится на любую реализацию, если это необходимо. Hibernate также является полной версией JPA + БОЛЬШЕ (вид JPA Plus). Hibernate - это супер набор JPA с некоторыми дополнительными функциями Hibernate. Поэтому приложение, разработанное в Hibernate, может быть несовместимо при переключении на другую реализацию. Все еще спящий режим является выбором большинства разработчиков в качестве реализации JPA и широко используется.

Другая реализация JPA - OpenJPA (openjpa.apache.org), которая является расширением реализации Kodo.

15

JPA: - это как интерфейс и не имеет конкретной реализации для использования функций, которые есть в JPA.

Спящий режим: - это просто поставщик JPA, который реализует функции в JPA и может иметь некоторые дополнительные функции, которые могут отсутствовать в JPA.

СОВЕТ: вы можете использовать

     *combo 1* : JPA + JPA Provider(Hibernate) 
     *combo 2* : only Hiberante which does not need any interface 

Combo 1: используется, когда вы чувствуете, что ваш спящий режим не дает более высокой производительности и хочет изменить поставщика JPA, если вам не нужно писать JPA еще раз. Вы можете написать еще один поставщик JPA... и можете изменить столько раз, сколько сможете.

Комбо 2: используется очень не так, как если вы не собираетесь менять поставщика JPA любой ценой.

Посетите http://blog-tothought.rhcloud.com//post/2, где ваше полное замешательство станет понятным.

11

JPA - это интерфейс, Hibernate - это одна реализация этого интерфейса.

  • 2
    и вдобавок к этому Hibernate добавляет еще несколько функций / методов.
10

JPA - это спецификация для стандартизации ORM-API. Hibernate является поставщиком реализации JPA. Поэтому, если вы используете JPA с гибернацией, вы можете использовать стандартный JPA API, спящий режим будет находиться под капотом, предлагая несколько нестандартных функций. См. http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html_single/ и http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/

8

JPA и Hibernate Difference

JPA - это спецификация для доступа, хранения и управления данными между объектами Java и реляционной базой данных. Поскольку определение говорит о его API, это только спецификация. Для API нет реализации. JPA определяет набор правил и рекомендаций для разработки интерфейсов, которые следуют стандарту. Прямо к сути: JPA - это всего лишь руководство по реализации реляционного сопоставления объектов (ORM), и для реализации не существует базового кода.

Где, как, Hibernate - это фактическая реализация руководящих принципов JPA. Когда hibernate реализует спецификацию JPA, это будет сертифицировано группой JPA после соблюдения всех стандартов, упомянутых в спецификации. Например, руководящие принципы JPA предоставят информацию об обязательных и дополнительных функциях, которые будут реализованы как часть реализации JPA.

Hibernate - поставщик JPA. Когда в спецификации будут внесены новые изменения, hibernate выпустит обновленную версию спецификации JPA.

5

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

Если вы используете Hibernate или других поставщиков вместо JPA, вы не можете легко переместиться в спящий режим на EclipseLink или OpenJPA на Hibernate. Но если вы используете JPA, вам просто нужно изменить представление в файле XML с сохранением. легко возможно в JPA.

4

Вот одна из лучших статей, прочитанных на эту тему. В этой длинной 7-страничной статье описывается разница с плюсами/минусами между iBatis/Hibernate/JPA.

Престижность участникам статьи

Для раздела спецификации JPA начните чтение с Page 5.. еще начинайте с нуля отсюда:

http://www.javaworld.com/article/2077875/open-source-tools/ibatis--hibernate--and-jpa--which-is-right-for-you-.html

4

В то время как JPA является спецификацией, Hibernate является поставщиком реализации, который следует правилам, продиктованным спецификацией.

4

JPA - это API, один из которых Hibernate реализует. Hibernate предшествует JPA. Перед JPA вы пишете собственный спящий код для выполнения ORM. JPA - это просто интерфейс, поэтому теперь вы пишете JPA-код, и вам нужно найти реализацию. Hibernate - это реализация.

Итак, ваш выбор таков: hibernate, toplink и т.д.

Преимущество JPA заключается в том, что он позволяет вам поменять вашу реализацию, если это необходимо. Недостаток заключается в том, что собственный API-интерфейс hibernate/toplink/etc... может предлагать функциональные возможности, которые не поддерживаются спецификацией JPA.

3

Java - его независимость не только от операционной системы, но и от поставщика.

Следовательно, вы должны иметь возможность развертывать свое приложение на разных серверах приложений. JPA реализуется на любом Java-сервере, совместимом с EE-совместимым сервером, и позволяет обменивать серверы приложений, но затем реализация также меняется. Приложение Hibernate может быть проще развертывать на другом сервере приложений.

2

JPA - это JSR, то есть спецификация Java. Требование реализовать реляционное сопоставление объектов, не имеющее конкретного кода для его реализации. Он определяет определенный набор правил для доступа, хранения и управления данными между объектами Java и реляционной базой данных. С его введением EJB был заменен, поскольку его критиковали за то, что он был супертяжелом от сообщества разработчиков Java. Hibernate - один из способов реализации JPA с использованием рекомендаций te.Hibernate - высокопроизводительная служба сохранения и обслуживания объектов/реляций, которая лицензируется в рамках открытой публичной лицензии GNU с открытым исходным кодом (LGPL). Преимущество этого в том, что вы может поменять реализацию Hibernate JPA для другой реализации спецификации JPA. Когда вы используете прямой Hibernate, вы блокируете реализацию, потому что другие ORM могут использовать разные методы/конфигурации и аннотации, поэтому вы не можете просто переключиться на другую ORM.

2

JPA - это спецификация Java API, которая описывает управление реляционными данными в приложениях с использованием платформы Java. где Hibernate - это библиотека ORM (реляционное сопоставление объектов), которая следует спецификации JPA.

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

1

JPA - это просто спецификация, которая нуждается в конкретной реализации. Реализация по умолчанию, предоставляемая oracle, - это "Eclipselink". Toplink пожертвован Oracle для создания Eclipse, чтобы объединиться с eclipselink.

Используя Eclipselink, можно быть уверенным, что код переносится на любую реализацию, если это необходимо. Hibernate также представляет собой полную реализацию JPA + БОЛЬШЕ. Hibernate - это супер набор JPA с некоторыми дополнительными функциями Hibernate. Поэтому приложение, разработанное в Hibernate, может быть несовместимо при переключении на другую реализацию. Все еще спящий режим является выбором большинства разработчиков в качестве реализации JPA и широко используется.

Другая реализация JPA - это OpenJPA, которая является расширением реализации Kodo.

JPA против Hibernate

0

JPA - это Java Persistence API. Который определяет только спецификации API. Означает, что набор правил и рекомендаций по созданию API. Если говорит другой контекст, это набор стандартов, который предоставляет оболочку для создания этих API, может использоваться для доступа к объекту объекта из базы данных. JPA предоставляется oracle.Когда мы собираемся делать доступ к базе данных, нам определенно нужна его реализация. Средство JPA указывает только рекомендации по внедрению API. Hibernate является поставщиком/поставщиком JPA, который отвечает за реализацию этих API. Как Hibernate TopLink и Open JPA являются примерами поставщиков JPA API. Поэтому мы используем стандартные API API JPA через спящий режим.

0

JPA или Java Persistence API - стандартная спецификация для реализации ORM, тогда как Hibernate - это реальная реализация ORM или инфраструктура.

0

JPA - это всего лишь спецификация, в то время как Hibernate является одним из поставщиков JPA. hibernate реализует различные вещи, упомянутые в контракте JPA.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню