Любые недостатки использования Hibernate EntityManager (по сравнениюЯдро гибернации)?
Вопрос
Документация по Hibernate EntityManager состояния, что:
Вы можете использовать комбинацию всех трех компонентов вместе, аннотации без JPA программные интерфейсы и жизненный цикл или даже чистое ядро Hibernate Core, в зависимости от деловых и технических потребностей вашего проекта.Вы можете в любое время вернуться к встроенным API Hibernate или, при необходимости, даже к встроенным JDBC и SQL.
Код, использующий JPA API (EntityManager), явно более переносим (даже со случайными резервными вариантами для Hibernate Core).
Но будут ли у меня какие-либо преимущества при использовании чисто ядра гибернации?Интересно, действительно ли модель JPA 2 помещается поверх ядра Hibernate без каких-либо противоречий?Итак, всегда ли возврат к Ядру прост и без проблем?
Моя главная забота заключается в следующем:
Возможно, различия заключаются не только в API, но и в базовом семантика?!(e.g.различная семантика транзакций / управления версиями / блокировки, которая может конфликтовать:Пессимистическая блокировка упоминается в документации Ядра, но не в документации EntityManager - так могу ли я по-прежнему использовать пессимистическую блокировку, вернувшись к ядру, не вызывая проблем?Подобные вещи ...)
Решение
Но будут ли у меня какие-либо преимущества при использовании чисто ядра гибернации?
Если JPA 2.0 поддерживает то, что вам нужно, на мой взгляд, нет никакого преимущества при непосредственном использовании Hibernate Core (а с JPA 2.0 разрыв стал более тонким, что делает необходимость возврата к Core исключением, а не правилом, что очень хорошо).
Интересно, действительно ли модель JPA 2 помещается поверх ядра Hibernate без каких-либо противоречий?
Начиная с JPA 1.0, разработчики Hibernate создали Hibernate3 с учетом "JPA" и приняли семантику JPA, значения по умолчанию и т.д. В Hibernate3.Возможно, вам захочется послушать Гэвина в этом Технический Разговор:Гэвин Кинг о Hibernate3 и EJB3:
В этом техническом выступлении Кинг обсуждает как Hibernate3 основывается на и расширяет EJB3, затрагивающий такие темы , как:
- Новые возможности Hibernate3
- Связь между Hibernate3 и контейнером EJB3 в JBoss
- Что отличает Hibernate3 от спецификации EJB3
- Пользовательские аннотации Hibernate, доступные за пределами EJB
- Будущее Hibernate
И, согласно моему практическому опыту, тот факт, что Hibernate не противоречит EJB 3, является правдой.
Итак, всегда ли возврат к Ядру прост и без проблем?
Независимо от того, используете вы Core напрямую или нет, вы являются используя его (the EntityManager
является оберткой вокруг Session
).Так что, да, вернуться к ядру легко, если вам действительно нужно (например, для вещей, которых все еще нет в спецификации, таких как Query By Example).И нет, это не вызовет никаких проблем (поскольку вы на самом деле используете его или его подмножество в JPA).
Сопутствующие вопросы
Другие советы
Было ясно: В зависимости от деловых и технических потребностей вашего проекта
Но у меня есть какие-либо преимущества при использовании чисто гибернационного ядра?
Не забывайте, как в гибернации аннотации, так и гибернат Entitymanager построен на вершине гибернационного ядра. Так еще один слой. Отказ Кроме того, он полагается на его метаданные сопоставления, хранящиеся в файлах XML. Некоторые пользователи предпочитают использовать XML-файлы вместо аннотаций, потому что он оставляет объекты домена, полностью независимы от выбора реализации DAO. Но при использовании аннотаций Hibernate с книгой JPA ясна
Уменьшите ваши строки кода для метаданных сопоставления, по сравнению с нативными файлами XML, и вам могут понравиться лучшие возможности рефакторинга аннотаций
JDBC >> Hibernate core >> Hibernate Annotations
...
JDBC >> Hibernate core >> Hibernate EntityManager
И JPA 2 лучше подходит тем, что JPA 1 не был предоставлен. Многие новые функции теперь доступны, такие как
- Объектно ориентированный запрос API
- Обертная @embeddable.
- Коллекция @embeddables @ElementCollection
И так далее...
Не забудьте, что EntityManager JPA позволяет получить основной поставщик, специфичный поставщик, используя getdelegate. Метод Если вам нужны функции, где JPA не предоставляет.
Я люблю использование сервисного ядра напрямую. Я также предпочитаю файлы отображения XML.
Я не очень интересуюсь использовать вторичный слой, чтобы получить доступ к функциональности основной гибернации. Насколько я обеспокоен переносимостью в устойчивом уровне, является полная не проблема.
Очень мало реальных преимуществ API API jpa над Hibernate API - я видел людей, использующих jpa по имени запросы (где критерии, вероятно, были бы яснее и лучше), а аннотации JPA несколько лучше разработаны.
Кроме того, JPA - это просто слой, добавляя сложность и потенциальные накладные расходы - без пособия. Архитектурно в такой ситуации правильное решение было бы против его использования.
Портативность базы данных OTOH очень реальна. У меня есть пользовательские распределители (генераторы), которые я использую, которые полностью портативны, и гораздо более исполнителя и проще, чем сумасшедший беспорядок, который является неправильно разработанным гибернацией.
Такой подход был очень успешным по сравнению с несколькими крупными коммерческими, правительственными и устаревшими проектами по реинжиновническим проектам. Короче говоря - сосредоточиться на том, что важно - и API на вершине API, не так.
Преимущества использования API JPA далеко перевешивают любые недостатки использования чистого гиберната. Я не эксперт, но я не знаю о любых ситуациях, где было бы выгодно снизить к гибернации. (Снижение к чистой JDBC - это другое дело.)
Если у кого-то есть какие-либо примеры, чтобы поделиться, я хотел бы увидеть их.