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