Что такое реализация JPA?

Я начинаю работать с JPA и не понимаю, что именно делает реализация JPA (EclipseLink, TopLink, Hibernate и т. д.).

Я понимаю теоретическую роль JPA, но какова цель различных реализаций? Существуют ли существенные различия между этими вариантами, например, с соединителями/драйверами БД? Какой лучше для новичка?

Я, вероятно, выберу EclipseLink, потому что именно он используется в большей части литературы, которую я читал.


person user262525    schedule 18.12.2010    source источник
comment
Я предлагаю вам провести собственное исследование относительно того, какая реализация соответствует вашему приложению. То, что работает для кого-то, может быть просто потому, что этот человек знал это раньше. На выбор влияет множество факторов... лицензия, поддержка, известные ошибки, доступные функции, производительность. Слепой выбор только потому, что это сделал кто-то другой, может привести к большой головной боли ;-)   -  person DataNucleus    schedule 18.12.2010


Ответы (5)


JPA

JPA — это просто API (отсюда Java Persistence API), для использования которого требуется реализация.

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

С JPA, как я уже сказал, вам нужна реализация, набор классов, лежащих «ниже» JPA, и такая реализация будет делать то, что вы хотите.

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

Популярные реализации включают Hibernate, EclipseLink, OpenJPA и другие.

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

Но! Функциональность, предоставляемая этими реализациями, может выходить за рамки стандартного JPA API.

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

Например, несмотря на то, что JPA определяет аннотацию @Id с параметрами генерации идентификатора, при использовании Hibernate вы также можете использовать @org.hibernate.annotations.GenericGenerator для конкретных стратегий генерации Hibernate.

Использование этой аннотации не будет работать, если вы не используете Hibernate в качестве базовой реализации.

Суть такова: JPA — это «наименьший общий знаменатель», который реализует каждый поставщик, и каждая реализация может иметь некоторые более продвинутые функции, которые не являются стандартными.

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

person darioo    schedule 18.12.2010
comment
Я слишком долго искал этот ответ, +1 за явное объяснение различий между общими аннотациями JPA и конкретными аннотациями Hibernate. - person rado; 09.08.2017

Это то же самое, что и Java, у него есть спецификация (Java SE, Java EE) и реализация, большинство людей используют эталонную реализацию (от Sun / Oracle), которая является образцом для других, чтобы сделать свою собственную «лучшую» и «продвинутую» реализацию. спецификации (API, интерфейсы и документация / JavaDoc, если вам нужно определение из одного слова, хотя это гораздо больше)

Таким образом, Java/JDK, который вы, скорее всего, используете, является просто реализацией (которая очень популярна). Существует гораздо больше реализаций, некоторые из них имеют больше параметров конфигурации сборки мусора, некоторые утверждают, что они быстрее, а некоторые просто не стоит использовать.

Таким образом, реализация в основном делает все, у нее есть код, где JPA - это API (подразумевается его именем, Java Persistance API), например. опять же, больше об интерфейсах и документации, чем о реальном внедрении интерфейса.

Думайте об этом как об абстрактном классе, который расширяет/реализует реализация Hibernate JPA/EclipseLink.

Что касается JPA, в отличие от Hibernate, который имеет единую реализацию, идея состоит в том, чтобы отделить интерфейс от реализации, чтобы победила «лучшая» реализация и чтобы каждый мог участвовать в игре, а не только создатель интерфейса.

Это позволяет, например, для Google App Engine поддерживать JPA, так как ему просто нужно следовать API (DataNucleus — это реализация). то что JPA в GAE не такой уж и большой это уже другая история)

person Eran Medan    schedule 18.12.2010
comment
На самом деле сомнительно, что большинство людей используют эталонную реализацию (EclipseLink) в случае JPA. RI по определению является доказательством того, что спецификация реализуема; это все, что означает этот заголовок ... DataNucleus - это RI для JDO в том же контексте. Это не план для какой-либо другой реализации - спецификация и TCK являются ориентиром для того, является ли реализация правильной или нет, и уж точно не RI. - person DataNucleus; 18.12.2010

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

person supercena    schedule 14.05.2013

Java Persistence API (JPA) — это спецификация интерфейса прикладного программирования на языке программирования Java, описывающая управление реляционными данными в приложениях, использующих Java Platform, Standard Edition и Java Platform, Enterprise Edition. Java Persistence API возник как часть работы Экспертной группы JSR 220 процесса сообщества Java. JPA 2.0 был разработан экспертной группой JSR 317.

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

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

Например :

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

public interface AccessAuthenticator {
    public boolean verifyAccess(String username,String saltedPassword);
}

Теперь эта спецификация содержит только один интерфейс и один-единственный метод.

Чтобы использовать эту спецификацию (точнее, метод verifyAccess()), у вас должна быть реализация.

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

Еще один аспект предоставления спецификации заключается в том, что вы на самом деле не используете конкретную реализацию чего-либо, поэтому сегодня скажем, что вы используете спящий режим для подключения к своей базе данных, но завтра появится какая-то лучшая ORM, которая реализует спецификацию JPA, тогда все, что вам нужно нужно изменить зависимость в вашем проекте (просто говоря, заменить файл JAR реализации/редактировать файл pom).

person Faizan Mohammad    schedule 23.02.2016

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

Поэтому вам нужна конкретная реализация, которая реализует JPA (набор правил). Hibernate, OpenJPA — это лишь немногие из известных реализаций JPA.

person Badal    schedule 12.02.2014