В чем разница между JPA и Hibernate?
Я понимаю, что 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?
23 ответа
Как вы заявляете, JPA - это просто спецификация, то есть реализации нет. Вы можете аннотировать свои классы столько раз, сколько захотите, с помощью аннотаций JPA, однако без реализации ничего не произойдет. Думайте о JPA как о руководящих принципах или интерфейсе, в то время как реализация JPA в Hibernate - это код, который соответствует API, как определено в спецификации JPA, и предоставляет функциональные возможности под капотом.
Когда вы используете Hibernate с JPA, вы фактически используете реализацию Hibernate JPA. Преимущество этого заключается в том, что вы можете поменять реализацию JPA в Hibernate на другую реализацию спецификации JPA. Когда вы используете прямой Hibernate, вы привязываетесь к реализации, потому что другие ORM могут использовать другие методы / конфигурации и аннотации, поэтому вы не можете просто переключиться на другой ORM.
Для более подробного описания читайте мою запись в блоге.
Некоторые вещи слишком трудно понять без исторической перспективы языка и понимания JCP.
Часто есть третьи стороны, которые разрабатывают пакеты, которые выполняют функцию или заполняют пробел, который не является частью официального JDK. По различным причинам эта функция может стать частью Java JDK через JCP (процесс сообщества Java)
Hibernate (в 2003 году) предоставил способ абстрагирования SQL и позволил разработчикам больше думать о персистентных объектах (ORM). Вы уведомляете hibernate о своих объектах Entity, и он автоматически генерирует стратегию для их сохранения. Hibernate предоставил реализацию для этого и API для управления реализацией через XML-конфигурацию или аннотации.
Основная проблема сейчас заключается в том, что ваш код тесно связан с конкретным поставщиком (Hibernate), что, по мнению многих, должно быть более общим. Отсюда необходимость общего API персистентности.
Тем временем JCP с большим вкладом от Hibernate и других поставщиков инструментов ORM разрабатывал JSR 220 (Запрос спецификации Java), который привел к 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/
JPA - это интерфейс, а Hibernate - это реализация.
Традиционно было несколько решений Java ORM:
каждая реализация определяет свое собственное определение отображения или клиентский API. Экспертная группа JPA собрала лучшее из всех этих инструментов, и поэтому они создали стандарт API Java Persistence.
Стандартный API персистентности очень удобен с точки зрения клиента, что позволяет относительно легко переключать одну реализацию с другой (хотя на практике это не так просто, поскольку в больших проектах вам все равно придется использовать определенные нестандартные функции),
Стандарт JPA поднял конкуренцию Java ORM на новый уровень, и это может привести только к лучшим реализациям.
Как объясняется в моей книге "Высокопроизводительное постоянство Java", Hibernate предлагает функции, которые еще не поддерживаются JPA:
- генераторы расширенных идентификаторов ( hi / lo, pooled, pooled-lo)
- прозрачная готовая выписка
- настраиваемый CRUD (
@SQLInsert
,@SQLUpdate
,@SQLDelete
) заявления - фильтры статического или динамического сбора (например,
@FilterDef
,@Filter
,@Where
) и фильтры сущностей (например,@Where
) - сопоставление свойств с фрагментами SQL (например,
@Formula
) - неизменяемые объекты (например,
@Immutable
) - больше режимов промывки (например,
FlushMode.MANUAL
,FlushMode.ALWAYS
) - запрос кеша второго уровня по естественному ключу данного объекта
- стратегии параллелизма кэша на уровне объекта (например,
Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
) - версионные массовые обновления через HQL
- исключить поля из оптимистической проверки блокировки (например,
@OptimisticLock(excluded = true)
) - оптимистическая блокировка без версии (например,
OptimisticLockType.ALL
,OptimisticLockType.DIRTY
) - поддержка пропуска (без ожидания) запросов пессимистичной блокировки
- поддержка Java 8 Дата и время
- поддержка мультитенанса
- поддержка мягкого удаления (например,
@Where
,@Filter
)
Эти дополнительные функции позволяют Hibernate удовлетворять многим требованиям к постоянству, предъявляемым крупными корпоративными приложениями.
Из вики.
Мотивация для создания 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 предоставляет множество дополнительных вещей.
Hibernate является провайдером JPA.
Страница JPA против Hibernate Кришны Шринивасан говорит:
JPA - это спецификация для доступа, сохранения и управления данными между объектами Java и реляционной базой данных. Поскольку определение говорит о его API, это всего лишь спецификация. Нет реализации для API. JPA определяет набор правил и рекомендаций для разработки интерфейсов, соответствующих стандарту. Прямо к делу: JPA - это всего лишь руководство для реализации объектно-реляционного сопоставления (ORM), и для реализации нет базового кода. Где, как, Hibernate является фактической реализацией руководящих принципов JPA. Когда hibernate реализует спецификацию JPA, она будет сертифицирована группой JPA при соблюдении всех стандартов, упомянутых в спецификации. Например, руководящие принципы JPA будут содержать информацию об обязательных и дополнительных функциях, которые должны быть реализованы в рамках реализации JPA.
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.
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, где прояснится ваше полное замешательство.
JPA - это интерфейс, Hibernate - одна из реализаций этого интерфейса.
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/
JPA - это просто спецификация. На рынке есть много поставщиков, которые реализуют JPA. Различные типы поставщиков реализуют JPA по-разному. поэтому разные типы поставщиков предоставляют разные функции, поэтому выбирайте подходящего поставщика в соответствии с вашими требованиями.
Если вы используете Hibernate или каких-либо других поставщиков вместо JPA, вы не можете легко перейти в режим гибернации в EclipseLink или OpenJPA в Hibernate. Но если вы используете JPA, вам просто нужно изменить, предоставьте в XML-файле постоянства. Так что миграция легко возможна в JPA.
JPA - это API, который реализует Hibernate.Hibernate предшествует JPA. До JPA вы пишете собственный код гибернации для работы с ORM. JPA - это просто интерфейс, так что теперь вы пишете код JPA и вам нужно найти реализацию.Hibernate является реализацией.
Таким образом, ваш выбор таков: Hibernate, TopLink и т.д...
Преимущество JPA состоит в том, что он позволяет вам менять свою реализацию в случае необходимости. Недостатком является то, что собственный hibernate/toplink/etc... API может предлагать функции, которые не поддерживаются в спецификации JPA.
В то время как JPA является спецификацией, Hibernate является поставщиком реализации, который следует правилам, определенным в спецификации.
Java - это независимость не только от операционной системы, но и от производителя.
Следовательно, вы должны иметь возможность развертывать свое приложение на разных серверах приложений. JPA реализован на любом сервере приложений, совместимом с Java EE, и позволяет менять серверы приложений, но затем реализация также меняется. Приложение Hibernate может быть проще для развертывания на другом сервере приложений.
JPA - это спецификация, которую вы реализуете на своем уровне данных для выполнения операций с БД, сопоставлений ИЛИ и других необходимых задач.
Поскольку это всего лишь спецификация, вам нужен инструмент для ее реализации. Этим инструментом могут быть Hibernate, TopLink, iBatis, spring-data и т. Д.
Вам не обязательно требовать JPA, если вы используете Hibernate на вашем уровне данных. Но если вы будете использовать спецификацию JPA для Hibernate, то в будущем это облегчит переключение на другие инструменты ORM, такие как iBatis, TopLink, поскольку эта спецификация является общей и для других.
* (если вы помните, вы делаете import javax.persistence.*;
когда вы используете аннотации для сопоставления ИЛИ (например, @Id, @Column, @GeneratedValue и т. д.) в Hibernate, где вы используете JPA в Hibernate, вы также можете использовать JPA @Query и другие функции)
JPA - это JSR, то есть требование спецификации Java для реализации объектно-реляционного сопоставления, в котором нет конкретного кода для его реализации. Он определяет определенный набор правил для доступа, сохранения и управления данными между объектами Java и реляционной базой данных. С его введением EJB был заменен, так как был раскритикован сообществом разработчиков Java как тяжеловесный. Hibernate - это один из способов реализации JPA с использованием инструкций. Hibernate - это высокопроизводительная служба объектных / реляционных постоянств и запросов, лицензируемая по лицензии GNU Lesser General Public License (LGPL) с открытым исходным кодом. Преимущество этого заключается в том, что вы может поменять реализацию JPA в Hibernate на другую реализацию спецификации JPA. Когда вы используете прямой Hibernate, вы привязываетесь к реализации, потому что другие ORM могут использовать другие методы / конфигурации и аннотации, поэтому вы не можете просто переключиться на другой ORM.
JPA - это спецификация API Java, которая описывает управление реляционными данными в приложениях, использующих платформу Java. где Hibernate - это библиотека ORM (Object Relational Mapping), соответствующая спецификации JPA.
Вы можете думать о JPA как о наборе правил, который реализуется Hibernate.
Я пытаюсь объяснить в очень простых словах.
Предположим, вам нужен автомобиль, так как мы все знаем, что это несколько производителей класса А, таких как MERCEDES, BMW, AUDI и т. Д.
Теперь в вышеприведенном утверждении CAR(это спецификация), поскольку у каждого автомобиля есть общие черты, такие как вещь с 4 колесами, и его можно водить по дороге, это автомобиль... так что это как JPA. А MERCEDES, BMW, AUDI и т. Д. Просто используют общую функцию автомобиля и добавляют функциональность в соответствии со своей клиентской базой, поэтому они внедряют спецификации автомобиля, такие как Hibernate, iBATIS и т. Д.
Таким образом, эти общие черты переходят в jpa, а hibernate - это просто реализация в соответствии с их потребностями в jboss.
Еще 1 вещь
JPA включает в себя некоторые базовые свойства, поэтому в будущем, если вы захотите изменить режим гибернации на любую другую реализацию, вы можете легко переключаться без особой головной боли, и для этих базовых свойств предусмотрены аннотации JPA, которые могут работать для любой технологии реализации, запросов JPQL.
Таким образом, в основном мы реализуем hibernate с технологией типа JPA только на тот случай, если мы захотим переключить нашу реализацию в соответствии с потребностями клиента, плюс вы напишете меньше кода, поскольку в JPA задействованы некоторые общие функции. Если кто-то все еще не ясно, то вы можете прокомментировать, как я новичок в переполнении стека.
Спасибо
JPA - это просто спецификация, которая требует конкретной реализации. Реализация по умолчанию, предоставляемая oracle, теперь называется "Eclipselink". Toplink пожертвован Oracle для основания Eclipse для объединения с eclipselink.
Используя Eclipselink, можно быть уверенным, что код является переносимым для любой реализации, если возникнет такая необходимость. Hibernate также является полной реализацией JPA + БОЛЬШЕ. Hibernate - это супер-набор JPA с некоторыми дополнительными функциями Hibernate. Поэтому приложение, разработанное в Hibernate, может быть несовместимо при переключении на другую реализацию. Тем не менее, hibernate является выбором большинства разработчиков в качестве реализации JPA и широко используется.
Другая реализация JPA - это OpenJPA, которая является расширением реализации Kodo.
JPA или Java Persistence API - это стандартная спецификация для реализаций ORM, тогда как Hibernate является реальной реализацией или платформой ORM.
JPA является лишь спецификацией, в то время как Hibernate является одним из поставщиков JPA, т.е. hibernate реализует различные вещи, упомянутые в контракте JPA.
JPA - это API персистентности Java. Который определяет только спецификации для API. Означает, что это набор правил и рекомендаций по созданию API. Если говорит другой контекст, это набор стандартов, который обеспечивает оболочку для создания этих API, может использоваться для доступа к объекту сущности из базы данных. JPA предоставляется oracle. Когда мы собираемся осуществлять доступ к базе данных, нам определенно нужна его реализация. Значит, JPA определяет только рекомендации по реализации API. Hibernate - это поставщик / поставщик JPA, который отвечает за реализацию этих API. Как и Hibernate TopLink и Open JPA являются примерами поставщиков JPA API. Таким образом, мы используем указанные в JPA стандартные API через Hibernate.
Образно говоря, JPA - это просто интерфейс, Hibernate/TopLink - класс (т.е. реализация интерфейса).
Вы должны иметь реализацию интерфейса, чтобы использовать интерфейс. Но вы можете использовать класс через интерфейс, т.е. использовать Hibernate через JPA API, или вы можете использовать реализацию напрямую, т.е. использовать Hibernate напрямую, а не через чистый JPA API.
Хорошая книга о JPA - "Высокопроизводительная стойкость Java" Влада Михальча.