Документация Hibernate EntityManager утверждает , что:
Вы можете использовать комбинацию всех трех вместе, аннотации без программных интерфейсов JPA и жизненного цикла, или даже чистый собственный Hibernate Core, в зависимости от бизнеса и технических потребностей вашего проекта. Вы можете в любое время вернуться к собственным API Hibernate или, при необходимости, даже к собственным JDBC и SQL.
Код, использующий JPA API (EntityManager), явно более переносим (даже с периодическими откатами на Hibernate Core).
Но будут ли у меня какие-то преимущества при использовании только Hibernate Core? Интересно, действительно ли модель JPA 2 подходит поверх Hibernate Core без каких-либо противоречий? IOW, всегда ли легко и без проблем вернуться к Core?
Меня больше всего беспокоит следующее:
Может быть, различия не только в API, но и в базовой семантике ?! (например, различная семантика транзакций / управления версиями / блокировками, которые могут конфликтовать: пессимистическая блокировка упоминается в документации Core, но не в документации EntityManager - так что могу ли я использовать пессимистическую блокировку, возвращаясь к Core, не вызывая проблем? Такие вещи .. .)
Но будут ли у меня какие-то преимущества при использовании исключительно Hibernate Core?
Если JPA 2.0 поддерживает то, что вам нужно, то, на мой взгляд, нет никаких преимуществ при использовании Hibernate Core напрямую (а с JPA 2.0 разрыв стал более тонким, делая необходимость возврата к Core исключением, а не правилом, что очень хорошо).
Интересно, действительно ли модель JPA 2 подходит к Hibernate Core без каких-либо противоречий?
Да, подходит, начиная с JPA 1.0. Разработчики Hibernate создали Hibernate3 с "JPA в голове" и приняли семантику JPA, значения по умолчанию и т.д. в Hibernate3. Вы можете послушать Гэвина в этом Tech Talk: Gavin King on Hibernate3 and EJB3:
В этом техническом выступлении Кинг обсуждает как Hibernate3 основывается на и расширяет EJB3, затрагивая такие темы, как:
- Новые возможности Hibernate3
- Отношения между Hibernate3 и контейнером EJB3 в JBoss
- Что отличает Hibernate3 от спецификации EJB3
- Пользовательские аннотации Hibernate доступны вне EJB
- Будущее Hibernate
И согласно моему практическому опыту, тот факт, что Hibernate не противоречит EJB 3, является правдой.
То есть, всегда ли откат к Core происходит легко и без проблем?
Используете ли вы Core напрямую или нет, вы используете его (EntityManager
является оберткой вокруг Session
). Так что, да, вернуться к Core легко, если это действительно необходимо (для вещей, которых все еще нет в спецификации, таких как Query By Example, например). И нет, это не вызовет никаких проблем (поскольку вы действительно используете его или его подмножество в JPA).
Преимущества использования JPA api намного превосходят любые недостатки использования чистого hibernate. Я не эксперт, но я не знаю ни одной ситуации, в которой было бы выгодно опуститься до hibernate. (Опускаться до чистого JDBC - это совсем другое дело.)
Если у кого-нибудь есть примеры, которыми можно поделиться, я бы с удовольствием их посмотрел.
Было ясно: в зависимости от бизнеса и технических потребностей вашего проекта
Но есть ли у меня какие-либо преимущества при использовании только ядра Hibernate?
Не забывайте, что и Hibernate Annotations, и Hibernate EntityManager построены на основе ядра Hibernate. Итак, еще один слой .Помимо этого, он полагается на свои метаданные отображения, хранящиеся в файлах XML. Некоторые пользователи предпочитают использовать XML-файлы вместо аннотаций, потому что это оставляет объекты домена полностью независимыми от выбранной вами реализации DAO. Но при использовании аннотаций Hibernate с книгой JPA ясен
, уменьшите количество строк кода для сопоставления метаданных по сравнению с собственными файлами XML, и вам могут понравиться лучшие возможности рефакторинга аннотаций
JDBC >> Hibernate core >> Hibernate Annotations
...
JDBC >> Hibernate core >> Hibernate EntityManager
И JPA 2 подходит лучше, чем JPA 1 не был предоставлен. Теперь доступно множество новых функций, таких как
И так далее ...
Не забывайте, что JPA EntityManager позволяет вы получаете его базового поставщика, зависящего от поставщика, используя метод getDelegate , если вам нужны функции, которые не предоставляются JPA.