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 +.