В чем разница между JPA и Hibernate? [закрыт]
Вопросы по JPA 2 и Hibernate: различия и рекомендации
Я понимаю, что JPA 2 — это спецификация, а Hibernate — инструмент для ORM. Также я осознаю, что Hibernate предоставляет больше возможностей, чем JPA 2. Но с практической точки зрения, какова реальная разница между ними?
У меня есть опыт работы с iBatis, и теперь я пытаюсь изучить либо Hibernate, либо JPA 2. Я взял книгу "Pro JPA 2", в которой постоянно упоминается "провайдер JPA". Например:
Если вы считаете, что какую-либо функцию следует стандартизировать, вам следует заявить об этом вашему провайдеру JPA.
Это вызывает у меня путаницу, поэтому у меня есть несколько вопросов:
- Могу ли я, используя только JPA 2, извлекать данные из базы данных, просто аннотируя свои POJO?
- Предназначен ли JPA 2 для использования с "провайдером JPA", таким как TopLink или Hibernate? Если да, то в чем преимущество использования комбинации JPA 2 + Hibernate по сравнению с использованием только JPA 2 или только Hibernate?
- Можете ли вы порекомендовать хорошую практическую книгу по JPA 2? "Pro JPA 2", по моему мнению, больше похожа на библию и справочник по JPA 2 (в ней не рассматриваются запросы до второй половины книги). Есть ли книга, которая подходит к JPA 2 с точки зрения решения практических задач?
5 ответ(ов)
JPA — это как танец, а Hibernate — танцор. JPA задает правила и структуру, в то время как Hibernate реализует эти правила в коде и выполняет их на практике. JPA предоставляет абстракцию для работы с базой данных, а Hibernate служит конкретной реализацией этих абстракций, помогая управлять взаимодействием с базой данных более эффективно.
Некоторые аспекты Java трудно понять без исторической перспективы языка и понимания JCP (Java Community Process).
Часто существуют сторонние разработчики, создающие пакеты, которые выполняют определенные функции или заполняют пробелы, отсутствующие в официальном JDK. По разным причинам эти функции могут стать частью Java JDK через JCP.
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). Эти спецификации представляют собой универсальный Java Persistence API. 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 — это всего лишь спецификация, требующая конкретной реализации. По умолчанию Oracle предоставляет реализацию Eclipselink. (Топлинк был передан Oracle в Eclipse Foundation для объединения с Eclipselink).
Используя 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 Provider (Hibernate)
*комбинация 2*: только Hibernate, который не требует никакого интерфейса
Комбинация 1 используется, когда вы замечаете, что Hibernate не обеспечивает лучшую производительность и хотите сменить JPA Provider. В этом случае вам не нужно переписывать ваш JPA, вы можете просто написать другого JPA Provider и менять их столько раз, сколько хотите.
Комбинация 2 используется гораздо реже, когда вы точно знаете, что не будете менять ваш JPA Provider ни при каких обстоятельствах.
Посетите http://blog-tothought.rhcloud.com//post/2, чтобы прояснить все ваши сомнения.
JPA — это интерфейс, а Hibernate — одна из реализаций этого интерфейса.
Как исправить ошибку Hibernate "объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр перед сбросом"
JPA JoinColumn против mappedBy: в чем разница?
Как вывести строку запроса с параметрами при использовании Hibernate
Возможные значения конфигурации hbm2ddl.auto в Hibernate и их назначение
Создание репозитория Spring без сущности