Я понимаю, что 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?
Ответы:
Как вы заявляете, JPA - это просто спецификация, то есть реализации нет. Вы можете аннотировать свои классы столько раз, сколько захотите, с помощью аннотаций JPA, однако без реализации ничего не произойдет. Думайте о JPA как о руководящих принципах или интерфейсе, в то время как реализация JPA в Hibernate - это код, который соответствует API, как определено в спецификации JPA, и предоставляет функциональные возможности под капотом.
Когда вы используете Hibernate с JPA, вы фактически используете реализацию Hibernate JPA. Преимущество этого заключается в том, что вы можете поменять реализацию JPA в Hibernate на другую реализацию спецификации JPA. Когда вы используете прямой Hibernate, вы привязываетесь к реализации, потому что другие ORM могут использовать другие методы / конфигурации и аннотации, поэтому вы не можете просто переключиться на другой ORM.
Для более подробного описания читайте мою запись в блоге .
источник
org.hibernate
аннотацию. подробнее об этомJPA - это танец, Hibernate - это танцор.
источник
Некоторые вещи слишком трудно понять без исторической перспективы языка и понимания 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/
источник
JPA - это интерфейс, а Hibernate - это реализация.
Традиционно было несколько решений Java ORM:
каждая реализация определяет свое собственное определение отображения или клиентский API. Экспертная группа JPA собрала лучшие из всех этих инструментов, и поэтому они создали стандарт API Java Persistence.
Стандартный API персистентности очень удобен с точки зрения клиента, что позволяет относительно легко переключать одну реализацию с другой (хотя на практике это не так просто, поскольку в больших проектах вам все равно придется использовать определенные нестандартные функции) ,
Стандартный JPA поднял конкуренцию Java ORM на новый уровень, и это может привести только к лучшим реализациям.
Как объяснялось в моей книге «Высокопроизводительное постоянство Java» , Hibernate предлагает функции, которые еще не поддерживаются JPA :
@SQLInsert
,@SQLUpdate
,@SQLDelete
) отчетности@FilterDef
,@Filter
,@Where
) и объектные фильтры (например@Where
)@Formula
)@Immutable
)FlushMode.MANUAL
,FlushMode.ALWAYS
)Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
)@OptimisticLock(excluded = true)
)OptimisticLockType.ALL
,OptimisticLockType.DIRTY
)@Where
,@Filter
)Эти дополнительные функции позволяют Hibernate удовлетворять многим требованиям к постоянству, предъявляемым крупными корпоративными приложениями.
источник
Из вики .
Как сказано на странице JCP, ссылка Eclipse является эталонной реализацией для JPA. Посмотрите на этот ответ немного больше по этому вопросу.
Сам JPA имеет функции, которые восполнят стандартную среду ORM. Поскольку JPA является частью спецификации Java EE, вы можете использовать только JPA в проекте, и он должен работать с любыми серверами, совместимыми с Java EE . Да, эти серверы будут иметь реализации для спецификации JPA.
Hibernate является самой популярной средой ORM , после того как JPA была представлена, Hibernate соответствует спецификациям JPA . Помимо базового набора спецификаций, которым он должен следовать, hibernate предоставляет множество дополнительных вещей.
источник
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.
СОВЕТ: вы можете использовать
Комбо 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 - это спецификация API Java, которая описывает управление реляционными данными в приложениях, использующих платформу Java. где Hibernate - это библиотека ORM (Object Relational Mapping), соответствующая спецификации JPA.
Вы можете думать о JPA как о наборе правил, который реализуется Hibernate.
источник
JPA - это JSR, то есть требование спецификации Java для реализации объектно-реляционного сопоставления, в котором нет конкретного кода для его реализации. Он определяет определенный набор правил для доступа, сохранения и управления данными между объектами Java и реляционной базой данных. С его введением EJB был заменен, так как был раскритикован сообществом разработчиков Java за тяжеловес. Hibernate - это один из способов реализации JPA с использованием руководящих принципов. Hibernate - это высокопроизводительная служба объектных / реляционных постоянств и запросов, которая лицензируется в рамках GNU Lesser General Public License (LGPL) с открытым исходным кодом. Преимущество этого заключается в том, что вы может поменять реализацию JPA в Hibernate на другую реализацию спецификации JPA.
источник
JPA - это просто спецификация, которая требует конкретной реализации. Реализация по умолчанию, предоставляемая oracle, теперь называется «Eclipselink». Toplink пожертвован Oracle для основания Eclipse для объединения с eclipselink.
Используя Eclipselink, можно быть уверенным, что код является переносимым для любой реализации, если возникнет такая необходимость. Hibernate также является полной реализацией JPA + БОЛЬШЕ. Hibernate - это супер-набор JPA с дополнительными функциями Hibernate. Поэтому приложение, разработанное в Hibernate, может быть несовместимо при переходе на другую реализацию. Тем не менее, hibernate является выбором большинства разработчиков в качестве реализации JPA и широко используется.
Другая реализация JPA - это OpenJPA, которая является расширением реализации Kodo.
JPA против Hibernate
источник
Я пытаюсь объяснить в очень простых словах.
Предположим, вам нужен автомобиль, поскольку мы все знаем, что их несколько производителей класса А, такие как MERCEDES, BMW, AUDI и т. Д.
Теперь в вышеприведенном утверждении CAR (это спецификация), поскольку у каждого автомобиля есть общие черты, такие как вещь с 4 колесами, и его можно водить по дороге, это автомобиль ... так что это как JPA. А MERCEDES, BMW, AUDI и т. Д. Просто используют общую функцию автомобиля и добавляют функциональность в соответствии со своей клиентской базой, поэтому они внедряют спецификации автомобиля, такие как Hibernate, iBATIS и т. Д.
Таким образом, эти общие черты переходят в jpa, а hibernate - просто реализация в соответствии с их потребностями в jboss.
Еще 1 вещь
JPA включает в себя некоторые базовые свойства, поэтому в будущем, если вы захотите изменить режим гибернации на любую другую реализацию, вы можете легко переключаться без особой головной боли, и для этих базовых свойств включены аннотации JPA, которые могут работать для любой технологии реализации, запросов JPQL.
Таким образом, в основном мы реализуем hibernate с технологией типа JPA только на тот случай, если мы захотим переключить нашу реализацию в соответствии с потребностями клиента, плюс вы напишете меньше кода, поскольку в JPA задействованы некоторые общие функции. Если кто-то все еще не ясно, вы можете прокомментировать, как я новичок в переполнении стека.
Спасибо
источник
JPA является лишь спецификацией, в то время как Hibernate является одним из поставщиков JPA, т.е. hibernate реализует различные вещи, упомянутые в контракте JPA.
источник
JPA или Java Persistence API - это стандартная спецификация для реализаций ORM, тогда как Hibernate является реальной реализацией или платформой ORM.
источник
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» Влада Михальчи.
источник