В чем разница между JPA и Hibernate? [закрыто]

680

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

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

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

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

  • Используя только JPA2, я могу получать данные из БД, просто комментируя свои POJO
  • Предполагается, что JPA2 будет использоваться с «провайдером JPA», например, TopLink или Hibernate? Если так, то в чем выгода использования JPA2 + Hibernate по сравнению с одним JPA2 или с одним только Hibernate?
  • Можете ли вы порекомендовать хорошую практическую книгу JPA2. «Pro ​​JPA2» больше похоже на библию и ссылку на JPA2 (он не попадает в запросы до второй половины книги). Есть ли книга, которая использует подход «проблема / решение» к JPA2?
Энтони
источник
2
Вопрос о «разнице между JPA и Hibernate» некорректен. Битва Hibernate против JPA бессмысленна. Рекомендуется использовать любую реализацию JPA с JPA API, чтобы избежать реализации различных ORM.
БЕРГУИГА Мохамед Амин
18
@ Berguiga.M.Amine, если мы уже знали, что этот вопрос неверен. Нам больше не нужно спрашивать. Меня тоже интересует эта тема.
До Нху Вы
У меня путаница с JpaTemplate, который используется весной "org.springframework.orm.jpa.JpaTemplate", он имеет свои собственные функции, такие как persist (), find (), merge () и т. Д., Как все работает без спящего режима?
нитин верма
@nitinverma: Это действительно отдельный вопрос. Если вам все еще нужен ответ, я предлагаю вам задать свой вопрос отдельно, чтобы привлечь больше отзывов.
Wouter

Ответы:

776

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

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

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

Кевин Бауэрсокс
источник
5
Итак, когда вы используете Hibernate с JPA, аннотации {java.persistence} будут работать или вам придется использовать аннотации {org.hibernate}?
Amruta
62
Я просто хотел добавить, что замена одного ORM на другой - это очень редкий случай, поэтому вы, вероятно, никогда не получите эту выгоду от использования JPA. Что вы получаете с JPA, это протокол, стандарты, наименования и другие соглашения, которые вы можете использовать для общения с другими.
публика
3
@pubsy Я согласен, но в принципе это одно из преимуществ спецификации.
Кевин Бауэрсокс,
6
@Amruta, чтобы ответить на ваш вопрос, когда вы используете Hibernate с JPA, аннотации {java.persistence} будут работать, и вам не нужно будет использовать аннотации {org.hibernate}.
Учащийся
3
@JavaGeek, это правда, если код использует только интерфейс, упомянутый в JPA. Если кто-то использует функции, специфичные для спящего режима, он должен использовать org.hibernateаннотацию. подробнее об этом
Суряванши
632

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

johnm
источник
189
JPA - это искусство, Hibernate - художник.
Счастливчик
10
Мне нравится это чувство юмора :) JPA - режиссер, Hibernate - актер.
user3278897
7
но Dancer (Hibernate) может выступать без танцев (JPA), не так ли: /
RevanthKrishnaKumar V.
3
Этот ответ ничего не объясняет, только расплывчатое высказывание.
Амир Кост
11
Эта метафора не добавляет понимания. Если вы уже знаете разницу, вы найдете ее удивительной. Если вы не знаете разницу, вы все равно не будете ее знать.
Волынкин
158

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

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

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

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

Между тем, 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 как слой абстракции ...
Aphax
4
@Aphax Конечно, и когда вы кодируете файлы .java, вы также тесно связаны с Java, что если я захочу перейти на Python завтра?
Smutje
100

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

Традиционно было несколько решений Java ORM:

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

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

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

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

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

Влад Михалча
источник
Это хорошо, я не знал о других инструментах ORM ранее
Avdhut
Отличный ответ, и мне очень нравится книга! Спасибо за выпуск этого!
JonasJSchreiber
Спасибо за то, что наслаждаетесь моей книгой о сохранении Java .
Влад Михальча
Этот ~ JPA является интерфейсом, в то время как Hibernate является реализацией
Eddie B
57

Из вики .

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

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

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

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

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

ManuPK
источник
3
Тем не менее, вы можете использовать JPA один в проекте. ?? Вы имеете в виду без использования Hibernate, TopLink или любой другой реализации JPA?
Аббас
2
@abbas да. Спецификации Java EE используют только JPA. Если вы добавите Hibernate, это даст некоторые дополнительные функции.
ManuPK
1
Я слышал, что JPA - это только интерфейс / спецификация. Если мы используем JPA один в проекте, то откуда он берется за его реализацию?
Аббас
@abbas спасибо за комментарий. Я добавил более подробную информацию в ответ. Надеюсь это поможет.
ManuPK
1
@ Forhad Всегда должна быть реализация, вне зависимости от того, скрыта ли она в какой-либо серверной архитектуре или нет, нет способа просто скачать библиотеку JPA и заставить ее выполнять постоянство за вас.
Кевин Бауэрсокс,
15

JPA - это просто спецификация, которая требует конкретной реализации. По умолчанию реализация 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, может быть несовместимо при переходе на другую реализацию. Тем не менее, hibernate является выбором большинства разработчиков в качестве реализации JPA и широко используется.

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

сверхновая звезда
источник
15

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

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

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

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

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

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

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

vkrishna17
источник
11

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

Тиаго Бургос
источник
2
и вдобавок к этому Hibernate добавляет еще несколько функций / методов.
rai.skumar
10

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

kandarp
источник
5

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

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

sus007
источник
4

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

Таким образом, ваш выбор таков: Hibernate, TopLink и т.д ...

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

Vanishree Gv
источник
4

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

javierZanetti
источник
3

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

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

Арджан Тиймс
источник
3

JPA - это спецификация, которую вы реализуете на своем уровне данных для выполнения операций с БД, сопоставления ИЛИ и других необходимых задач.

Так как это просто спецификация , вам нужен инструмент для его реализации. Этим инструментом могут быть Hibernate, TopLink, iBatis, spring-data и т. Д.

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

* ( если вы помните, вы делаете, import javax.persistence.*;когда вы используете аннотации для сопоставления ИЛИ (например, @Id, @Column, @GeneratedValue и т. д.) в Hibernate, где вы используете JPA в Hibernate, вы можете использовать JPA @Query и другие функции, такие как хорошо )

Арун Раадж
источник
2

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

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

Badal
источник
2

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

codechefvaibhavkashyap
источник
1

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

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

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

JPA против Hibernate


источник
1

Я пытаюсь объяснить в очень простых словах.

Предположим, вам нужен автомобиль, поскольку мы все знаем, что их несколько производителей класса А, такие как MERCEDES, BMW, AUDI и т. Д.

Теперь в вышеприведенном утверждении CAR (это спецификация), поскольку у каждого автомобиля есть общие черты, такие как вещь с 4 колесами, и его можно водить по дороге, это автомобиль ... так что это как JPA. А MERCEDES, BMW, AUDI и т. Д. Просто используют общую функцию автомобиля и добавляют функциональность в соответствии со своей клиентской базой, поэтому они внедряют спецификации автомобиля, такие как Hibernate, iBATIS и т. Д.

Таким образом, эти общие черты переходят в jpa, а hibernate - просто реализация в соответствии с их потребностями в jboss.

Еще 1 вещь

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

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

Спасибо

Раджив Багел
источник
Спасибо за совет
Раджив Багел
0

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

user1157635
источник
0

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

Амит Гуджаратхи
источник
-1

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

Mr.DevEng
источник
-2

Образно говоря, JPA - это просто интерфейс, Hibernate / TopLink - класс (т.е. реализация интерфейса).

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

Хорошая книга о JPA - «Высокопроизводительная стойкость Java» Влада Михальчи.

Антон Тупы
источник