Hibernate Vs iBATIS [закрыто]


для нашего нового продукта реинжиниринга, мы находимся в процессе выбора лучших рамок из Java. Поскольку рассмотрение должно идти для агностического подхода к базе данных для модели, мы работаем над вариантами между распорками + пружиной с iBATIS или Hibernate. Пожалуйста, совет, который лучше всего, как оба предлагают настойчивость.

6 66

6 ответов:

Ibatis и Hibernate совершенно разные звери.

Как я склонен смотреть на это так: Hibernate работает лучше, если ваш взгляд больше

подумайте, чего вы пытаетесь достичь. Как правило, Сегрегация Ответа На Командный Запрос модель хорошо работает для сложных доменов.

причина в том, что вы пытаетесь сделать одну из двух вещей обычно:

  1. создать / обновить / удалить некоторые сложные доменные сущности
  2. запуск аналитических запросов выборки (т. е. запросов суммирования/агрегации)

Hibernate работает хорошо для случая 1 позволяя вы просто делаете POJO и сохраняете/обновляете его. Он также делает это быстро, если ваш домен не является довольно большим.

myBatis отлично подходит для запросов выборки (случай 2), где вы просто хотите получить ответ. Hibernate попытается загрузить весь граф объектов, и вам нужно будет начать настраивать запросы с помощью трюков LazyLoading, чтобы он работал на большом домене. И наоборот, если вам просто нужна какая-то аналитическая страница POJO, реализация myBatis того же запроса будет тривиальный.

из-за этого, myBatis быстрее, чем спящий режим at выбирает.

эти два случая-разница между команды где вы хотите изменить данные домена и ответы где вы просто хотите, чтобы принести некоторые данные.

Итак, рассмотрим эти два случая и то, что ваше приложение делает. Если у вас есть простой домен и просто получить информацию, используйте myBatis. Если у вас сложный домен и сохраняются сущности, используйте спящий режим. Если вы делаете и то, и другое, рассмотрите гибридный подход. Вот что мы используем в нашем проекте, который имеет тысячи лиц, чтобы держать его под контролем. ;)

Клетус проделал большую работу по подведению итогов этого сравнения. Hibernate хорошо работает при управлении моделью данных и является более объектно-ориентированным, в то время как iBATIS хорошо работает, когда вам нужно интегрировать с существующей базой данных и более ориентирован на данные.

также я думаю, что Hibernate имеет немного кривой обучения. С iBATIS довольно легко узнать, что происходит, в то время как с Hibernate происходит больше "магии". Другими словами, новички могут найти iBatis проще в использовании и понимать.

но я не говорю, что вы должны предпочесть iBatis, iBatis и Hibernate просто разные, как сказано выше.

и кстати, если вы переходите на спящий режим, возможно, рассмотрите возможность использования стандартизированных аннотаций JPA и EJB 3.0 (JSR-220) object/relational mapping, предоставленных Hibernate Аннотации.

ORM vs persistence framework

Hibernate-это структура сопоставления объектных отношений (ORM), которая сопоставляет классы Java с таблицами базы данных. MyBatis-это структура персистентности, а не ORM. Он сопоставляет операторы SQL с методами Java.

схемы базы данных

Hibernate может создавать или проверять схему базы данных в соответствии с вашей моделью Java, в то время как MyBatis не имеет такой функции. Также удобно для испытательной среды когда вы использование БД в памяти. Соответствующие обсуждения:

кэш

Hibernate имеет кэш первого уровня, который невозможно отключить. Это означает, что если вы запросите элемент через ORM, а затем удалите его непосредственно с помощью SQL, он останется в кэше. Вы можете прямо очистить кэш, чтобы получить наиболее обновленные результаты из базы данных. Связанный обсуждения:

оптимистичное управление замком

также есть различия для оптимистичного управления блокировкой:

MyBatis не поддерживает оптимистичный контроль параллелизма изначально, в отличие от инструментов ORM, таких как Hibernate/JPA с аннотация @Version.

обсуждений:

загрузка

Hibernate попытается загрузить весь граф объектов, за исключением объектов, которые помечены для ленивой загрузки. myBatis будет загружать данные в соответствии с SQL-запросом. Ленивая загрузка может повысить производительность, но это может привести к утечке соединения, если он используется с <property name="hibernate.enable_lazy_load_no_trans" value="true" /> свойства. Соответствующие обсуждения:

Hibernate-сессий управления

сущности операции, такие как сохранение, обновление или удаление выполняются с помощью Спящий режим сессии. Это требует хорошего понимания того, как реализовать правильную стратегию управления сеансом гибернации, чтобы избежать detached entity passed to persist и другие явления, связанные с гибернацией.

иногда может потребоваться больше времени, чтобы понять основное поведение спящего режима, чем добавить немного больше работы и написать необработанные SQL-операторы для myBatis.

каскадные

Hibernate обеспечивает каскадирование, удаление сирот и другие функции для графы объектов, пока они не представлены в myBatis - для их реализации вам нужно будет явно писать SQL-запросы.

запросы

в myBatis вы будете писать почти простые SQL-запросы. Hibernate имеет несколько вариантов для формирования запроса: SQL, HQL, критерии API. Иногда может быть целесообразно использовать API критериев, когда у вас есть много необязательных полей в критериях. Это обеспечит более структурированный подход к формированию запроса и, возможно, позволит избежать связанных с этим ошибок.

Если вы уже используете Spring, я бы начал с Spring JDBC, а не погружался прямо в спящий режим или iBatis. Если вы пишете свой уровень персистентности с точки зрения интерфейсов, у вас не должно быть проблем с переключением реализаций после того, как вы получили Hibernate или iBatis под вашим поясом.

нет никаких причин, почему это должно быть "все или ничего" решение. Используйте то, что лучше для вашей ситуации.

Hibernate-это ORM, что означает (на самом базовом уровне), что он сопоставляет экземпляры объектов java с фактическими строками в таблице базы данных. Как правило, для pojo, полученных через Hibernate: любые манипуляции и изменения этих pojo будут отображаться в базе данных. Hibernate будет генерировать и выполнять соответствующий SQL в соответствующее время.

Mybatis (на самом базовом уровне) - это просто инструмент для объединения и выполнения SQL, который хранится в xml-файлах. Это не карта экземпляры объектов Java к строкам в таблице базы данных, а он сопоставляет методы Java с инструкциями SQL, и поэтому он не является ORM. Он также может вернуть pojo, конечно, но они не привязаны к какому-либо контексту персистентности.

оба инструмента делают намного больше, чем описано выше, но один является ORM, а другой-нет.

критерии, позволяющие вам выбрать, какой из них использовать, я считаю, критически зависит от модели базы данных, которую вы должны работать с.

например, представьте себе большую растянутую схему, представляющую некоторую модель страхования. Разработчики обязаны получить данные, а также взаимодействовать с этими данными в соответствии с делу.

разработчик пришел на идти, и никогда не будет ожидать, чтобы иметь необходимые бизнес-знания, чтобы написать все sql вручную (что потребует Mybatis). Hibernate подойдет для такого сценария.

бизнес-аналитики определяют модель данных, сущности, отношения и взаимодействия, а также их опыт. Затем разработчик Java использует Hibernate для"прогулки по модели". Бизнес разработчика может стать очень продуктивным быстро, без необходимости писать сложные ошибки, подверженные sql для запуска на очень сложной схеме.

по моему опыту, как Hibernate, так и Mybatis регулярно используются в одном проекте.

где Hibernate используется для

  • общие C. R. U. D функциональность
  • "ходьба" реляционная модель "объект домена"
  • управление сеансами

и где Mybatis используется для

  • специальные запросы
  • запуск (и взаимодействие с) хранимыми процедурами
  • поддержка очень конкретных или сложных запросов
  • поддержка сложных поисковых запросов, где критерии поиска является динамическим, и подкачки результатов