Для нашей новой реорганизации продукта мы находимся в процессе выбора лучших фреймворков из Java. Поскольку рассмотрение заключается в том, чтобы перейти к агностическому подходу базы данных для модели, мы работаем над вариантами между Struts + Spring с iBATIS или Hibernate. Пожалуйста, совет, который лучше, поскольку оба предлагают настойчивость.
Hibernate Vs iBATIS
Ответ 1
Ibatis и Hibernate - совсем другие звери.
Как я обычно смотрю на это: Hibernate работает лучше, если ваше представление более объектно-ориентированное. Если, однако, вы больше ориентированы на базу данных, то Ibatis является гораздо более сильным выбором.
Если вы полностью контролируете свою схему и у вас нет чрезвычайно высокой пропускной способности, тогда Hibernate может работать достаточно хорошо. Объектная модель делает довольно удобный код, но при огромной сложности.
Если вы имеете дело с "устаревшей" схемой базы данных, где вам нужно писать довольно сложные SQL-запросы, вероятность того, что Ibatis будет работать лучше.
HQL (Hibernate Query Language) - это другой язык, который вам нужно будет изучить, и даже тогда вы, вероятно, найдете случаи, когда вам все еще нужно писать SQL. Что еще, скорее всего, вы потратите полдня на то, чтобы выяснить правильную комбинацию XML, свойств, аннотаций и т.д., Чтобы заставить Hibernate генерировать исполняемый SQL-запрос.
Для этого вопроса нет универсального ответа "A лучше, чем B".
Ответ 2
Подумайте, чего вы пытаетесь достичь. Как правило, Сегментация ответа на запрос команд модель хорошо работает для сложных доменов.
Причина в том, что вы пытаетесь сделать одну из двух вещей:
- Создание/обновление/удаление некоторых сложных объектов домена
- Запуск аналитических запросов выборки (т.е. запросов суммирования/агрегации)
Hibernate отлично работает для случая 1, позволяя вам просто сделать POJO и сохранить/обновить его. Он также делает это быстро, если ваш домен довольно большой.
myBatis отлично подходит для запросов на выборку (случай 2), где вы просто хотите получить ответ. Hibernate попытается загрузить весь графический объект, и вам нужно будет начать настройку запросов с помощью трюков LazyLoading, чтобы он работал над большим доменом. И наоборот, если вам просто нужна какая-то аналитическая страница POJO, реализация myBatis того же запроса будет тривиальной.
Из-за этого myBatis быстрее, чем Hibernate в SELECTS.
Эти два случая - разница между Командами, где вы хотите изменить данные домена и Ответы, где вы просто хотите получить некоторые данные.
Итак, рассмотрите эти два случая и то, что делает ваше приложение. Если у вас есть простой домен и просто выберите информацию, используйте myBatis. Если у вас сложный домен и сохраняемые объекты, используйте Hibernate. Если вы сделаете обоим, рассмотрите гибридный подход. Это то, что мы используем в нашем проекте, в котором тысячи организаций удерживают его под контролем.;)
Ответ 3
Cletus отлично справился с суммированием этого сравнения. Hibernate хорошо работает, когда вы управляете моделью данных и более объектно-ориентированным, в то время как iBATIS хорошо работает, когда вам нужно интегрироваться с существующей базой данных и более ориентироваться на данные.
Также я думаю, что Hibernate имеет немного больше кривой обучения. С iBATIS довольно легко понять, что происходит, в то время как с Hibernate происходит "волшебство". Другими словами, новички могут найти iBatis проще в использовании и понимании.
Но я не говорю, что вы должны предпочесть iBatis, iBatis и Hibernate просто отличаются, как сказано выше.
И, кстати, если вы идете на Hibernate, возможно, подумайте об использовании стандартизированных JPA и EJB 3.0 (JSR-220) аннотаций объектно-реляционного сопоставления, предоставляемых Hibernate Аннотации.
Ответ 4
если вы уже используете Spring, я бы начал с Spring JDBC, а не погрузился прямо в Hibernate или iBatis. Если вы пишете свой уровень стойкости в терминах интерфейсов, у вас не должно возникнуть проблем с реализацией переключения после того, как вы получите Hibernate или iBatis под вашим поясом.
Нет причин, по которым это должно быть решение "все или ничего". Используйте то, что лучше всего подходит для вашей ситуации.
Ответ 5
Hibernate - это ORM, то есть (на самом базовом уровне) он сопоставляет экземпляры Java-объектов с реальными строками в таблице базы данных. Как правило, для pojo, полученного через Hibernate: любые манипуляции и модификации этого pojo будут отображаться в базе данных. Hibernate будет генерировать и выполнять соответствующий SQL в соответствующее время.
Mybatis (на самом базовом уровне) - это просто инструмент для сборки и выполнения SQL, который хранится в xml файлах. Он не сопоставляет экземпляры объектов Java с строками в таблице базы данных, а скорее сопоставляет методы Java с SQL-запросами, и поэтому это не ORM. Он также может возвращать pojo, но они не привязаны к какому-либо контексту персистентности.
Оба инструмента делают намного больше, чем описано выше, но одно - ORM, а другое - нет.
Критерии, позволяющие вам выбрать, какой из них использовать, я считаю, в решающей степени зависят от модели базы данных, с которой вы должны работать.
Например, представьте себе большую растягивающуюся схему, представляющую некоторую модель страхования. Разработчики должны получить данных и взаимодействовать с этими данными таким образом, который соответствует бизнесу.
Разработчик придет на работу и никогда не будет ожидать наличия необходимых бизнес-знаний для написания всего sql вручную (что потребует Мибатис). Спящий режим подойдет к подобному сценарию.
Бизнес-аналитики определяют данные, сущности, отношения и взаимодействия, а также их опыт. Затем Java-разработчик использует Hibernate для "ходьбы по модели". Разработчик бизнеса может стать очень продуктивным быстро, без необходимости писать сложную ошибку, подверженную sql для работы на очень сложной схеме.
В моем опыте, как Hibernate, так и Mybatis используются регулярно в одном проекте.
Где Hibernate используется для
- Общая функциональность C.R.U.D
- "Прогулка" реляционной модели "объект домена"
- Управление сеансами
и где Mybatis используется для
- специальные запросы
- запускать (и взаимодействовать) хранимые процедуры
- поддержка очень специфических или сложных запросов
- поддерживают сложные поисковые запросы, где критерии поиска являются динамическими, а поисковые запросы
Ответ 6
ORM vs persistence framework
Hibernate - это структура сопоставления объектных отношений (ORM), которая сопоставляет классы Java с таблицами базы данных. MyBatis - это система персистентности, а не ORM. Он сопоставляет операторы SQL с методами Java.
Схема базы данных
Hibernate может создать схему базы данных в соответствии с вашей моделью Java, в то время как MyBatis не имеет такой функции. Связанные дискуссиях:
Кэш
Hibernate имеет кеш первого уровня, который невозможно отключить. Это означает, что если вы запрашиваете элемент через ORM, а затем удаляете его напрямую с помощью SQL, он остается в кеше. Вы можете явно очистить кеш, чтобы получать самые последние результаты из базы данных. Связанные дискуссиях:
- Сделайте Jpa & Данные загрузки гибернации, которые асинхронно изменяются в БД?
- Что такое кеширование первого и второго уровней в спящем режиме?
Оптимистичное управление блокировкой
Также существуют различия для оптимистического управления блокировкой:
MyBatis не поддерживает оптимистический concurrency контроль изначально, в отличие от инструментов ORM, таких как Hibernate/JPA с аннотацией @Version.
Связанные дискуссиях:
ленивая загрузка
Hibernate попытается загрузить весь графический объект, кроме объектов, помеченных для ленивой загрузки. myBatis будет загружать данные в соответствии с SQL-запросом. Ленивая загрузка может повысить производительность, но может привести к утечкам соединений, если она используется с
<property name="hibernate.enable_lazy_load_no_trans" value="true" />
свойства. Связанные дискуссиях:
- org.hibernate.LazyInitializationException - не удалось инициализировать прокси - нет сеанса
- Решите проблему Hibernate Lazy-Init с hibernate.enable_lazy_load_no_trans
Управление сеансом Hibernate
Операции объектов, такие как сохранение, обновление или удаление, выполняются с помощью Hibernate Session. Это требует хорошего понимания того, как реализовать правильную стратегию управления сеансом Hibernate, чтобы избежать detached entity passed to persist
и других феноменов, связанных с Hibernate.
Иногда может потребоваться больше времени, пытаясь понять базовое поведение Hibernate, чем добавить немного больше работы и написать сырые инструкции SQL для myBatis.
Каскадные
Hibernate предоставляет каскадирование, удаление сирот и другие функции для графов объектов, пока они не присутствуют в myBatis - для их реализации вам нужно явно писать SQL-запросы.
Запросы
В myBatis вы будете писать почти необработанные SQL-запросы. Hibernate имеет несколько вариантов формирования запроса: SQL, HQL, API критериев. Иногда может быть целесообразно использовать API критериев, когда у вас есть много необязательных полей в критериях. Это обеспечит более структурированный подход для формирования запроса и, возможно, позволит избежать связанных ошибок.