Яка різниця між JPA і Hibernate? [зачинено]


680

Я розумію, що JPA 2 - це специфікація, і Hibernate - це інструмент для ORM. Також я розумію, що Hibernate має більше можливостей, ніж JPA 2. Але з практичної точки зору, яка насправді різниця?

У мене є досвід використання iBatis, і зараз я намагаюся навчитися або в сплячому режимі, або в JPA2. Я взяв книгу Pro JPA2, і вона посилається на "постачальника JPA". Наприклад:

Якщо ви вважаєте, що функція повинна бути стандартизованою, вам слід поговорити з нею та попросити її у свого постачальника JPA

Це мене бентежить, тому у мене є кілька питань:

  • Лише використовуючи JPA2, я можу отримати дані з БД, просто анотувавши мої POJO
  • Чи повинен JPA2 використовуватися з "постачальником послуг JPA", наприклад, TopLink або сплячий режим? Якщо так, то яка користь від використання JPA2 + Hibernate порівняно з JPA2 або порівняно зі сплячим режимом?
  • Чи можете ви порекомендувати хорошу практичну книгу JPA2. "Pro JPA2" схоже на Біблію та посилання на JPA2 (він не потрапляє до запитів до пізнішої половини книги). Чи є книга, яка застосовує підхід до вирішення проблеми JPA2?

2
Питання про "різницю між JPA та сплячим режимом" є невірним. Бій в сплячку проти JPA безглуздий. Доцільно використовувати будь-яку реалізацію JPA з API JPA, щоб уникнути впровадження різних ORM.
БЕРГУІГА Мохамед Амін

18
@ Berguiga.M.Amine, Якщо ми вже знали, що це вище питання є невірним. Нам більше не потрібно запитувати. Мене також цікавить ця тема.
Робити Nhu Vy

У мене плутанина з JpaTemplate, який використовується навесні "org.springframework.orm.jpa.JpaTemplate", він має власні функції, як persist (), find (), merge () і т.д.
нітинова верма

@nitinverma: Це справді окреме питання. Якщо вам все-таки потрібна відповідь, пропоную вам задати власне запитання окремо, щоб залучити більше відгуків.
Wouter

Відповіді:


776

Оскільки ви заявляєте, що JPA - це лише специфікація, тобто немає її реалізації. Ви можете коментувати свої заняття скільки завгодно за допомогою JAP-анотацій, однак без реалізації нічого не відбудеться. Розгляньте JPA як вказівки, яких слід дотримуватися, або як інтерфейс, тоді як реалізація JPA Hibernate - це код, який відповідає API, визначеному специфікацією JPA, і забезпечує функцію під капотом.

Коли ви використовуєте Hibernate з JPA, ви фактично використовуєте реалізацію Hibernate JPA. Перевага цього полягає в тому, що ви можете замінити реалізацію JPA в режимі Hibernate на іншу реалізацію специфікації JPA. Якщо ви використовуєте прямий сплячий режим, ви замикаєтесь на реалізації, оскільки інші ORM можуть використовувати різні методи / конфігурації та примітки, тому ви не можете просто перейти на інший ORM.

Для більш детального опису читайте мій запис у блозі .


5
Отже, коли ви використовуєте Hibernate разом із JPA, примітки {java.persistence} спрацюють, або вам доведеться використовувати анотації {org.hibernate}?
Amruta

62
Я просто хотів додати, що заміна одного ORM на інший є дуже рідкісним випадком, тому ви, ймовірно, ніколи не отримаєте цю користь від використання JPA. Що ви отримуєте за допомогою JPA - це протокол, стандарти, називання та інші умови, які ви можете використовувати для спілкування з іншими.
паббі

3
@pubsy Я згоден, але в принципі це одна з точок продажу специфікації.
Кевін Боуерсокс

6
@Amruta, щоб відповісти на ваше запитання, коли ви використовуєте Hibernate разом із JPA, анотації {java.persistence} працюватимуть і не потрібно використовувати анотації {org.hibernate}.
Учень

3
@JavaGeek, це правда, поки в коді використовується тільки інтерфейс, згаданий в JPA. Якщо використовуються функції, характерні для сплячого режиму, вони повинні використовувати org.hibernateанотацію. докладніше про це
Суряванші

632

JPA - танець, Hibernate - танцюрист.


189
JPA - Мистецтво, Hibernate - художник.
Пощастило

10
Мені подобається таке почуття гумору :) JPA - режисер, сплячий - актор.
користувач3278897

7
але танцюрист (сплячий) може виступати без танцю (JPA), чи не так: /
RevanthKrishnaKumar V.

3
Ця відповідь нічого не пояснює, лише розпливчаста приказка.
Амір Кост

11
Ця метафора не додає розуміння. Якщо ви вже знаєте різницю, вам це буде кумедно. Якщо ви не знаєте різниці, ви все одно не будете її знати.
Нік Волинкін

158

Деякі речі занадто важко зрозуміти без історичної точки зору мови та розуміння JCP.

Часто зустрічаються треті сторони, які розробляють пакети, які виконують функцію або заповнюють прогалини, які не є частиною офіційного JDK. З різних причин ця функція може стати частиною Java JDK через JCP (Java Community Process)

Hibernate (у 2003 р.) Створив спосіб абстрагувати SQL та дозволив розробникам більше мислити щодо збережених об'єктів (ORM). Ви повідомляєте про сплячий режим про свої об'єкти Entity, і це автоматично генерує стратегію їх збереження. Hibernate забезпечив реалізацію для цього та API для керування реалізацією через конфігурацію XML або примітки.

Основоположне питання зараз полягає в тому, що ваш код щільно поєднується з конкретним постачальником (в сплячому режимі), що багато людей вважають за загальне. Звідси потреба в загальному API стійкості.

Тим часом, JCP з великим вкладом від Hibernate та інших постачальників інструментів ORM розробляв JSR 220 (Запит специфікації Java), що призвело до JPA 1.0 (2006) і, врешті, JSR 317, що є JPA 2.0 (2009). Це специфікації загального API Persistent Java. API надається в JDK як набір інтерфейсів, щоб ваші класи могли залежати від javax.persistence і не турбуватися про конкретного постачальника, який виконує роботу зі збереженням ваших об'єктів. Це лише API, а не реалізація. Зимова сплячка стає одним з багатьох постачальників, які реалізують специфікацію JPA 2.0. Ви можете ввести код JPA і вибрати будь-який сумісний постачальник ORM відповідно до ваших потреб.

Бувають випадки, коли сплячий режим може надавати вам функції, кодифіковані в JPA. У цьому випадку ви можете вставити специфічну анотацію зі сплячки безпосередньо у свій клас, оскільки JPA не надає інтерфейс для цього.

Джерело: http://www.reddit.com/r/java/comments/16ovek/understanding_when_to_use_jpa_vs_hibernate/


2
Гарна частина історії. тоді як інші відповіді просто повторюють те, що йдеться в питанні.
Роберт

1
Дякую за тони, що просвітлюють. Ви сказали, що програма JPA була зроблена, тому що програми, де тісно поєдналися зі сплячим режимом, це було потребою в абстракції, добре. Але хіба це не безмежна проблема? Чи не зараз додаток щільно поєднаний із JPA? Яка тут реальна користь? Я вже бачу
сплячку

4
@Aphax Звичайно, і коли ви кодуєте .java файли, ви також щільно з'єднані з Java, так що, якщо я хочу перейти на Python завтра?
Smutje

100

JPA - це інтерфейс, а "Hibernate" - це реалізація.

Традиційно існує декілька рішень Java ORM:

кожна реалізація визначає власне визначення відображення або API клієнта. Експертна група JPA зібрала найкраще з усіх цих інструментів, і тому вони створили стандарт API Java Persistent API.

Стандартний API стійкості дуже зручний з точки зору клієнта, що дозволяє порівняно легко переключати одну реалізацію на іншу (хоча на практиці це не так просто, оскільки для великих проектів у будь-якому випадку вам доведеться використовувати конкретні нестандартні функції) .

Стандартний JPA висунув конкуренцію Java ORM на новий рівень, і це може призвести лише до кращої реалізації.

Як пояснено в моїй книзі, Високопродуктивна Java-наполегливість , Hibernate пропонує функції, які ще не підтримуються JPA :

Ці додаткові функції дозволяють сплячому режиму відповідати багатьом вимогам, що вимагають великих корпоративних програм.


Це добре, я про інші засоби ORM раніше не знав
Авдхут

Чудова відповідь, і я дуже насолоджуюся книгою! Дякуємо, що випустили його!
JonasJSchreiber

Дякуємо, що насолоджуєтесь моєю високоефективною книжкою наполегливості Java .
Влад Михальча

Цей ~ JPA - це інтерфейс, а "Hibernate" - це реалізація
Едді B

57

З Вікі .

Мотивація для створення API Java Persistence

Багато корпоративних розробників Java використовують легкі стійкі об’єкти, що надаються рамками з відкритим кодом або об'єктами доступу до даних, а не об'єктивними бобами: суб'єкти бобів та боби підприємств мають репутацію надто важкої та складної, і їх можна було використовувати лише на серверах додатків Java EE. Багато функцій сторонніх систем стійкості були включені в API Java Persistence, а на 2006 рік такі проекти, як Hibernate (версія 3.2) та Open Source Source TopLink Essentials стали реалізацією API Java Persistence.

Як сказано на сторінці JCP, посилання Eclipse - це Референтна реалізація для JPA. Подивіться на цю відповідь, щоб дізнатися більше про це.

У самому JPA є функції, які дозволять скласти стандартну основу ORM. Оскільки JPA є частиною специфікації Java EE, ви можете використовувати JPA самостійно в проекті, і він повинен працювати з будь-якими серверами, сумісними з Java EE . Так, ці сервери матимуть реалізацію для специфікації JPA.

Hibernate є найбільш популярними ORM рамки, коли JPA був введений в сплячому режимі відповідає JPA специфікацію. Окрім основного набору специфікацій про те, що він повинен дотримуватися сплячого режиму, передбачено ще безліч додаткових матеріалів.


3
Це означає, що ви можете використовувати JPA самостійно в проекті. Ви маєте на увазі без використання Hibernate, TopLink чи будь-якої іншої реалізації JPA?
abbas

2
@abbas так. Специфікація Java EE використовує лише JPA. Якщо додати сплячку, це надасть деякі додаткові функції.
ManuPK

1
Я чув, що JPA - це лише інтерфейс / специфікація. Якщо ми використовуємо JPA окремо в проекті, то звідки він отримує його реалізацію?
abbas

@abbas дякую за коментар. У відповідь я додав більше деталей. Сподіваюсь, це допомагає.
ManuPK

1
@Forhad Завжди повинна бути реалізація, незалежно від того, похована вона в якійсь архітектурі сервера чи ні, не має значення, немає можливості просто завантажити якусь бібліотеку JPA і дозволити їй виконувати наполегливість для вас.
Кевін Боуерсокс

15

JPA - лише специфікація, яка потребує конкретної реалізації. За замовчуванням реалізація Oracle тепер є "Eclipselink". (Toplink пожертвує Oracle фонду Eclipse для об'єднання з eclipselink)

(Довідка: http://www.oracle.com/technetwork/middleware/toplink/index-085257.html http://www.eclipse.org/org/press-release/20080317_Eclipselink.php )

Використовуючи Eclipselink, можна бути впевненим, що код є переносним для будь-якої реалізації, якщо виникає потреба. Hibernate - це також повна реалізація JPA + БІЛЬШЕ (сортування JPA Plus). Hibernate - це супер набір JPA з деякою додатковою функцією сплячого режиму. Тому додаток, розроблений в режимі глибокого сну, може бути не сумісний при переході на іншу реалізацію. Досі сплячий режим - це вибір більшості розробників як реалізація JPA та широко використовується.

Інша реалізація JPA - OpenJPA (openjpa.apache.org), яка є розширенням реалізації Kodo.


15

JPA: подібно до інтерфейсу і не має конкретної реалізації для використання функцій, які є в JPA.

Hibernate: це лише постачальник JPA, який має реалізацію функцій в JPA і може мати додаткові функції, яких може не бути в JPA.

ПОРАДА: ви можете використовувати

     *combo 1* : JPA + JPA Provider(Hibernate) 
     *combo 2* : only Hiberante which does not need any interface 

Комбо 1 : застосовується тоді, коли ви відчуваєте, що ваш сплячий режим не дає кращих показників, і хочете змінити постачальника JPA, щоб у той час вам не доведеться писати свій JPA ще раз. Ви можете написати іншого постачальника послуг JPA ... і можете змінити стільки разів, скільки зможете.

Комбо 2 : використовується дуже рідше, оскільки коли ви не збираєтесь змінювати свого постачальника JPA будь-якою ціною.

Завітайте на сторінку http://blog-tothought.rhcloud.com//post/2 , де ваша повна розгубленість проясниться.


11

JPA - це інтерфейс, Hibernate - це одна з реалізацій цього інтерфейсу.


2
і крім цього, Hibernate додає ще деякі функції / методи.
rai.skumar

10

JPA - специфікація для стандартизації ORM-API. Hibernate - постачальник реалізації програми JPA. Отже, якщо ви використовуєте JPA зі сплячим режимом, ви можете використовувати стандартний API JPA, сплячка буде під кришкою, пропонуючи ще кілька нестандартних функцій. Див. Http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html_single/ та http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/


5

JPA - це лише специфікація. На ринку існує багато постачальників, які реалізують JPA. Різні типи постачальників реалізують JPA по-різному. тому різні типи постачальників забезпечують різну функціональність, тому вибирайте належного постачальника відповідно до ваших вимог.

Якщо ви використовуєте Hibernate або будь-якого іншого постачальника замість JPA, ви не можете легко перейти в сплячку до EclipseLink або OpenJPA до Hibernate. Але якщо ви використовуєте JPA, то вам просто потрібно змінити, надайте постійний XML-файл. Тому міграція легко можлива в JPA


4

JPA - це API, який реалізує Hibernate.Hibernate передує JPA. Перед JPA ви пишете нативний сплячий код, щоб зробити свою ORM. JPA - це лише інтерфейс, тому тепер ви пишете JPA-код і вам потрібно знайти реалізацію. Спячий стан є реалізацією.

Тож ваш вибір такий: сплячка, топова посилання тощо ...

Перевага JPA полягає в тому, що він дозволяє замінити свою реалізацію за потреби. Недоліком є ​​те, що вроджений API hibernate / toplink / тощо ... може запропонувати функціональні можливості, які специфікація JPA не підтримує.


4

Хоча JPA є специфікацією, Hibernate - це постачальник впровадження, який дотримується правил, продиктованих у специфікації.


3

Java - її незалежність не тільки від операційної системи, але і від постачальника.

Тому ви повинні мати змогу розгорнути свою програму на різних серверах прикладних програм. JPA реалізований на будь-якому сервері додатків, сумісних з Java EE, і дозволяє обмінятися серверами прикладних програм, але потім реалізація також змінюється. Програму Hibernate може бути простіше розгорнути на іншому сервері додатків.


3

JPA - це специфікація, яку ви реалізуєте у вашому рівні даних для виконання операцій db, АБО зіставлення та інших необхідних завдань.

Оскільки це лише специфікація , для її реалізації потрібен інструмент. Цей інструмент може бути як Hibernate, TopLink, iBatis, Spring-data тощо.

Вам не обов'язково потрібно JPA, якщо ви використовуєте сплячий режим у своєму шарі даних. Але якщо ви використовуєте специфікацію JPA для Hibernate, то це в майбутньому полегшить перехід на інші засоби ORM, такі як iBatis, TopLink, оскільки специфікація є загальною і для інших.

* ( якщо ви пам'ятаєте, ви робите, import javax.persistence.*;коли ви використовуєте примітки для відображення АБО (наприклад, @Id, @Column, @GeneratedValue тощо) у режимі глибокого сну, саме там ви використовуєте JPA в режимі Hibernate, ви можете використовувати @Query та інші функції JPA як добре )


2

JPA - специфікація Java API, яка описує управління реляційними даними в додатках, що використовують платформу Java. де як Hibernate - це бібліотека ORM (Object Relational Mapping), яка відповідає специфікації JPA.

Ви можете розглядати JPA як набір Правил, які реалізує Hibernate.


2

JPA - JSR, тобто вимога специфікації Java для впровадження Об'єктної реляційної карти, яка не має конкретного коду для її реалізації. Він визначає певний набір правил доступу, зберігання та управління даними між об'єктами Java та реляційною базою даних. З його введенням EJB було замінено, оскільки його спільнота розробників Java зазнала важкої ваги. Hibernate - це один із способів впровадження JPA за допомогою керівних принципів. Hibernate - це високоефективна послуга об'єктів / реляційності та запитів, яка ліцензується на основі ліцензії на загальну публічну ліцензію з відкритим кодом GNU (LGPL). Перевагою цього є те, що ви може замінити реалізацію JPA Hibernate на іншу реалізацію специфікації JPA.


1

JPA - лише специфікація, яка потребує конкретної реалізації. Типова реалізація, що надається Oracle, зараз є "Eclipselink". Toplink пожертвує Oracle фонду Eclipse для об'єднання з eclipselink.

Використовуючи Eclipselink, можна бути впевненим, що код є переносним для будь-якої реалізації, якщо виникає потреба. Hibernate - це також повна реалізація JPA + БІЛЬШЕ. Hibernate - це супер набір JPA з деякою додатковою функцією сплячого режиму. Таким чином, програма, розроблена в режимі глибокого сну, може не бути сумісною при переході на іншу реалізацію. Досі сплячий режим - це вибір більшості розробників як реалізація JPA та широко використовується.

Ще одна реалізація JPA - OpenJPA, яка є розширенням реалізації Kodo.

JPA vs Hibernate


1

Я намагаюся пояснити дуже легкими словами.

Припустимо, вам потрібен автомобіль, як ми всі знаємо їх кілька виробників A класу, як MERCEDES, BMW, AUDI тощо.

Тепер у вищезазначеному твердженні CAR (це специфікація), оскільки кожен автомобіль має спільні риси, як річ з 4 колесами і може бути загнаний по дорозі - це автомобіль ... так це як JPA. І MERCEDES, BMW, AUDI тощо просто використовують загальну характеристику автомобіля та додають функціональність відповідно до клієнтської бази, тому вони реалізують специфікацію автомобіля, наприклад, у сплячому режимі, iBATIS тощо.

Таким чином, ця загальна особливість переходить до jpa, а сплячий режим - це лише реалізація відповідно до їх потреб jboss.

Ще 1 річ

JPA включає деякі основні властивості, тому в майбутньому, якщо ви хочете змінити сплячий режим на будь-яку іншу реалізацію, ви можете легко переключитися без особливого головного болю, а до цих основних властивостей належать анотації JPA, які можуть працювати для будь-якої технології впровадження, запитів JPQL.

Таким чином, ми в основному реалізуємо сплячку за допомогою технології типу JPA лише на той випадок, якщо ми хочемо переключити нашу реалізацію відповідно до потреб клієнта, плюс ви напишете менше коду, оскільки деякі спільні функції задіяні у JPA. Якщо комусь все ще не зрозуміло, ви можете прокоментувати як нове на переповнення стека.

Дякую


Дякую за пораду
rajiv baghel

0

JPA - лише специфікація, а Hibernate - один із постачальників JPA, тобто сплячий режим впроваджує різні речі, зазначені в договорі JPA.


0

API JPA або Java Persistence - це стандартна специфікація для реалізації ORM, тоді як Hibernate - це фактична реалізація ORM.


-1

JPA - API персистентності Java. Який Вказує лише специфікації для API. Це означає, що набір правил та вказівок для створення API. Якщо говорить інший контекст, це набір стандартів, який забезпечує обгортку для створення цих API, може бути використаний для доступу об'єкта об'єкта з бази даних. JPA надається Oracle. Коли ми будемо робити доступ до бази даних, нам, безумовно, потрібна його реалізація. Значить JPA визначає лише вказівки щодо впровадження API. Hibernate - постачальник / постачальник JPA, який відповідає за впровадження цих API. Як Hibernate TopLink і Open JPA - це деякі приклади постачальників API JPA. Таким чином, ми використовуємо стандартні API API, визначені JPA, у сплячому режимі.


-2

Образно кажучи, JPA - це просто інтерфейс, Hibernate / TopLink - клас (тобто реалізація інтерфейсу).

Для використання інтерфейсу ви повинні мати реалізацію інтерфейсу. Але ви можете використовувати клас через інтерфейс, тобто використовувати Hibernate через JPA API, або ви можете використовувати реалізацію безпосередньо, тобто використовувати Hibernate безпосередньо, а не через чистий JPA API.

Хороша книга про JPA - це "Високопродуктивна наполегливість Java" Влада Міхалчея.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.