Что такое реализация JPA?
Я начинаю с JPA, и меня смущает, что именно делает реализация JPA (EclipseLink, TopLink, Hibernate и т. Д.).
Я понимаю теоретическую роль JPA, но какова цель различных реализаций? Существуют ли существенные различия между этими вариантами, как, например, разъемы / драйверы БД? Что лучше для новичка?
Я, вероятно, пойду с EclipseLink, потому что именно этим пользуется большинство прочитанной мною литературы.
5 ответов
JPA - это просто API (отсюда и Java Persistence API), который требует реализации для использования.
Аналогия будет использовать JDBC. JDBC - это API для доступа к базам данных, но вам нужна реализация (файл jar драйвера), чтобы иметь возможность подключаться к базе данных. Сам по себе, без драйвера, вы ничего не можете сделать с базой данных.
В JPA, как я уже сказал, вам нужна реализация, набор классов, которые лежат "под" JPA, и такая реализация будет делать то, что вы хотите.
Ваше приложение использует JPA API (эта формулировка немного сложна, но я надеюсь, что вы поняли идею), которая затем связывается с базовой реализацией.
Популярные реализации включают Hibernate, EclipseLink, OpenJPA и другие.
Каждый из них реализует API JPA, поэтому, если вы используете только JPA, каждая реализация должна действовать одинаково.
Но! Функциональные возможности, предоставляемые этими реализациями, могут выходить за рамки стандартного API JPA.
Если вы хотите использовать эту конкретную функциональность, вам придется использовать API конкретного поставщика, который не будет совместим с другими.
Например, хотя JPA определяет @Id
аннотации с опциями генерации идентификаторов, при использовании Hibernate, вы также можете использовать @org.hibernate.annotations.GenericGenerator
для Hibernate конкретных стратегий генерации.
Использование этой аннотации не будет работать, если вы не используете Hibernate в качестве базовой реализации.
Суть в том, что JPA является "наименьшим общим знаменателем", который реализует каждый поставщик, и каждая реализация может иметь более продвинутые функции, которые не являются стандартными.
Если вы хотите, чтобы ваше приложение было переносимым, используйте только JPA. Если вы уверены, что в дальнейшем не передумаете и не переключитесь на другие реализации, используйте специфичные для поставщика функции JPA +.
Это то же самое, что и Java, у него есть спецификация (Java SE, Java EE) и реализация, большинство людей используют эталонную реализацию (от Sun / Oracle), которая является примером для других, чтобы сделать свою собственную "лучшую" и "продвинутую" реализацию спецификации (API, интерфейсы и документация / JavaDoc, если вам нужно определение в одно слово, хотя это гораздо больше)
Таким образом, Java / JDK, который вы, скорее всего, используете, является просто реализацией (которая очень популярна). Существует намного больше реализаций, некоторые имеют больше опций конфигурации Garbage Collection, некоторые утверждают, что работают быстрее, а некоторые просто не стоит использовать.
Таким образом, реализация в основном делает все, у нее есть код, где JPA - это API (подразумевается под его именем, Java Persistance API), например, опять же, больше об интерфейсах и документации, чем о реальной реализации интерфейса.
Думайте об этом как о абстрактном классе, который расширяет / реализует реализация JPA / EclipseLink в Hibernate.
Что касается JPA, в отличие от Hibernate, который имеет единственную реализацию, идея состоит в том, чтобы отделить интерфейс от реализации, чтобы победила "лучшая" реализация и чтобы каждый мог участвовать в игре, а не только создатель интерфейса.
Это позволяет, например, Google App Engine поддерживать JPA, так как ему просто нужно следовать API (DataNucleus является реализацией), если ему нужно использовать Hibernate, ему потребуется изменить выпуск Hiberanate для поддержки формата Google Big Table (То, что JPA в GAE не так уж велика, это другая история)
Сам JPA - это просто спецификация, а не продукт; он не может выполнять настойчивость или что-либо еще сам по себе. JPA - это просто набор интерфейсов, требующий реализации. Есть на выбор и коммерческие реализации JPA с открытым исходным кодом, и любой сервер приложений Java EE 5 должен обеспечивать поддержку для его использования. JPA также требует базы данных для сохранения.
Java Persistence API (JPA) - это спецификация интерфейса прикладного программирования на языке программирования Java, которая описывает управление реляционными данными в приложениях с использованием Java Platform, Standard Edition и Java Platform, Enterprise Edition. API персистентности Java возник как часть работы группы экспертов 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).
Еще один аспект предоставления спецификации заключается в том, что вы фактически не используете конкретную реализацию чего-либо, поэтому сегодня скажем, что вы используете hibernate для подключения к своей базе данных, но завтра появится более совершенный ORM, который реализует спецификацию JPA, а затем все, что вам нужно для этого нужно изменить зависимость в вашем проекте (простыми словами заменить файл реализации JAR / отредактировать файл pom).
JPA - это спецификация API Java, которая описывает управление реляционными данными в приложениях, использующих платформу Java. Вы можете рассматривать JPA как набор правил, и, следовательно, он не может выполнять какую-то конкретную работу за вас, но помогает стандартизировать вашу реализацию.
Поэтому вам нужна конкретная реализация, которая будет реализовывать JPA (набор правил). Hibernate, OpenJPA - это несколько известных реализаций JPA.