![JPA](https://i.stack.imgur.com/4sVPQ.png)
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