Я розумію, що JPA 2 - це специфікація, а Hibernate - це інструмент для ORM. Також я розумію, що Hibernate має більше можливостей, ніж JPA 2. Але з практичної точки зору, в чому насправді різниця?
У мене є досвід використання iBatis і зараз я намагаюся освоїти або Hibernate, або JPA2. Я взяв до рук книгу Pro JPA2, і вона постійно посилається на "JPA-провайдера". Наприклад:
"Якщо ви вважаєте, що функція повинна бути стандартизована, ви повинні сказати про це і попросити про це свого JPA-провайдера
Це мене бентежить, тому у мене є кілька запитань:
Як ви стверджуєте, JPA є лише специфікацією, що означає, що немає ніякої реалізації. Ви можете коментувати свої класи скільки завгодно за допомогою анотацій JPA, однак без реалізації нічого не відбудеться. Думайте про JPA як про керівні принципи, яких необхідно дотримуватися, або інтерфейс, в той час як реалізація JPA в Hibernate - це код, який відповідає API, визначеному специфікацією JPA, і забезпечує функціональність під капотом.
Коли ви використовуєте Hibernate з JPA, ви фактично використовуєте реалізацію Hibernate JPA. Перевага цього полягає в тому, що ви можете замінити реалізацію Hibernate JPA на іншу реалізацію специфікації JPA. Коли ви використовуєте прямий Hibernate, ви прив'язані до реалізації, оскільки інші ORM можуть використовувати інші методи/конфігурації та анотації, тому ви не можете просто переключитися на інший ORM.
Для більш детального опису читайте мій запис у блозі.
З Вікі.
Мотивація створення Java Persistence API
Багато розробників корпоративної Java використовують полегшені персистентні об'єкти, що надаються фреймворками з відкритим вихідним кодом або Data Access Objects замість бобів сутностей: боби сутностей і корпоративні боби мали репутацію занадто важких і складних, і використовувати їх можна було тільки в серверах додатків Java EE. Багато можливостей сторонніх фреймворків персистентності були включені в Java Persistence API, і з 2006 року такі проекти, як Hibernate (версія 3.2) та Open-Source версія TopLink Essentials стали реалізаціями Java Persistence API.
Як зазначено на сторінці JCP, посилання на Eclipse є еталонною реалізацією для JPA. Погляньте на цю відповідь, щоб дізнатися більше про це.
JPA сам по собі має функції, які компенсують стандартний фреймворк ORM. Оскільки JPA є частиною специфікації Java EE, ви можете використовувати тільки JPA в проекті, і він повинен працювати з будь-якими Java EE сумісними серверами. Так, ці сервери будуть мати реалізацію специфікації JPA.
Hibernate є найпопулярнішим фреймворком ORM, після впровадження JPA hibernate відповідає специфікаціям JPA. Окрім базового набору специфікацій, яким він повинен відповідати, Hibernate надає багато додаткових можливостей.
JPA - це специфікація для стандартизації ORM-API. Hibernate є постачальником реалізації JPA. Так що якщо ви використовуєте JPA з hibernate, ви можете використовувати стандартний JPA API, hibernate буде під капотом, пропонуючи ще деякі нестандартні функції. Дивіться http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html_single/ та http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/