Война фреймворков Java: весна и гибернация - PullRequest
28 голосов
/ 19 сентября 2008

Мои разработчики ведут гражданскую войну. В одном лагере они приняли Hibernate и Spring. В другом лагере они осудили фреймворки - хотя они рассматривают Hibernate.

Вопрос в том, есть ли какие-нибудь неприятные сюрпризы, слабости или ловушки, на которые новички Hibernate-Spring могут наткнуться?


PS: У нас есть библиотека DAO, которая не очень сложна. Я сомневаюсь, что он обладает богатством Hibernate, но он достигает какой-то зрелости (то есть он не был изменен в нескольких последних проектах, которые он включил).

Ответы [ 18 ]

39 голосов
/ 19 сентября 2008

Они денонсировали рамки ?

Это безумие. Если вы не используете готовый фреймворк, вы создаете свой собственный. Это все еще рамки.

28 голосов
/ 27 сентября 2008

Я использовал Hibernate несколько раз в прошлом. Каждый раз, когда я сталкивался с крайними случаями, когда определение синтаксиса переходило к поиску мусора через документацию, Google и старые версии. Это мощный инструмент, но плохо документированный (последний раз я смотрел).

Что касается Spring, то почти каждая работа, с которой я брал интервью или рассматривал ее в последние несколько лет, касалась Spring, она действительно стала стандартом де-факто для Java / веб. Его использование поможет вашим разработчикам стать более конкурентоспособными в будущем, и это поможет вам, поскольку у вас будет большой круг людей, которые будут понимать ваше приложение.

Написание собственных рамок заманчиво, познавательно и весело. Не очень хорошо по результатам.

16 голосов
/ 19 сентября 2008

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

Несколько советов:

  • Hibernate не заменит хороший дизайн базы данных. Схемы гибернации в порядке, но вам придется время от времени настраивать их
  • В конце концов вам придется понять, как Hibernate загружает классы и как это влияет на вещи. Hibernate изменяет байт-код Java, и вам придется рано или поздно углубляться в глубины, чтобы объяснить, почему ссылки на объекты являются нулевыми.
  • Используйте аннотации, если можете.
  • Потратьте время на изучение методов настройки производительности Hibernate, в долгосрочной перспективе это спасет вас.
7 голосов
/ 19 сентября 2008

Это одна вещь (я мог вспомнить), в которую я впал, когда был в мои дни гибернации. Когда вы удаляете (несколько) дочерних объектов из коллекции (в родительской сущности), а затем добавляете новые сущности в одну и ту же коллекцию за одну транзакцию без очистки в середине, Hibernate выполнит «вставку» перед «удалением». Если у дочерней таблицы есть уникальное ограничение в одном из ее столбцов, и вы ожидаете, что вы не нарушите ее, поскольку ранее вы уже удалили некоторые данные (как и я), то приготовьтесь разочаровываться. Спящий форум предлагает:

  1. Это был недостаток дизайна БД, редизайн;
  2. очистить (или зафиксировать, если хотите) между удаляемыми файлами и вставками;

Я не мог сделать и то и другое, и в итоге настроил источник Hibernate и перекомпилировал. Это была только 1 строка кода. Но попытка найти эту линию равнялась примерно 27 чашкам кофе и 3 бессонным ночам.

Это всего лишь один из примеров проблем и изюминок, которые могут возникнуть при использовании Hibernate без реального эксперта в вашей команде (эксперт: кто-то, обладающий достаточными знаниями о философии и внутренней работе Hibernate). Ваша проблема, решение, литр кофе и количество бессонной ночи могут различаться. Но вы поняли.

7 голосов
/ 19 сентября 2008

Если у вас довольно сложная база данных, Hibernate не для вас. На работе у нас довольно сложная база данных с большим количеством данных, и Hibernate на самом деле не работает для нас. Вместо этого мы начали использовать iBATIS. Тем не менее, я знаю много мастерских разработчиков, которые успешно используют Hibernate - и он делает для вас большую работу - поэтому стоит подумать.

Spring - хороший инструмент, если вы знаете, как правильно его использовать.

Я бы сказал, что фреймворки - определенно хорошая вещь - как уже говорили другие, вы не хотите изобретать велосипед. Spring содержит много модулей, которые означают, что вам не придется писать так много кода. Не поддавайтесь синдрому «Не изобретено здесь»!

7 голосов
/ 19 сентября 2008

Ленивая загрузка - это большой улов в MVC-приложениях, которые используют Hibernate для своей инфраструктуры постоянства. Вы загружаете объект в контроллер и передаете его в представление JSP. Некоторые или все члены класса находятся в прокси, и все взрывается, потому что сеанс Hibernate был закрыт, когда контроллер завершил работу.

Вам нужно прочитать статью Open Session in View , чтобы понять проблему и найти решение. Если вы используете Spring, эта статья блога описывает решение Spring для открытого сеанса в представлении.

5 голосов
/ 19 сентября 2008

Я мало работал с Java, но работал в больших группах разработчиков Java. У меня сложилось впечатление, что весна в порядке. Но все были расстроены в Hibernate. Половина команды, если ее спросят: «Если бы вы могли что-то изменить, что бы вы изменили?» и они скажут: «Избавься от спячки». Когда я начал изучать Hibernate, меня это поразило, но я не выучил достаточно (к счастью, я продвинулся вперед), чтобы понять, была ли сложность оправданной или нет (возможно, это требовало решения некоторых сложных проблем). 1001 *

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

5 голосов
/ 19 сентября 2008

Я всегда находил Hibernate немного сложным и трудным для изучения. Но поскольку JPA (Java Persistence API) и EJB (Enterprise Java Beans) 3.0 уже некоторое время стали намного проще, я предпочитаю комментировать свои классы для создания отображений с помощью JavaDoc или XML. Проверьте поддержку в Hibernate . Дополнительным бонусом является то, что можно (но не без усилий) изменить структуру базы данных позже, если это необходимо. Я использовал OpenJPA с отличными результатами.

В последнее время я все больше и больше пользуюсь JCR (Java Content Repository). Мне нравится, как мои модули могут совместно использовать одно хранилище данных и что я могу позволить структуре и свойствам развиваться. Мне гораздо проще работать с узлами и свойствами, чем сопоставлять мои объекты с базой данных. Хорошая реализация Jackrabbit .

Что касается Spring, он имеет много функций, которые мне нравятся, но количество XML, необходимое для настройки, означает, что я никогда не буду его использовать. Вместо этого я использую Guice и очень люблю его.

В заключение я бы показал вашим сомневающимся разработчикам, как Hibernate облегчит их жизнь. Что касается Spring, я бы серьезно проверил, является ли Guice жизнеспособной альтернативой, а затем попытался бы показать, как Spring / Guice делает разработку лучше и проще.

3 голосов
/ 19 сентября 2008

Я много занимался разработкой Spring / Hibernate. Со временем способ, которым люди использовали оба в комбинации, немного изменился. Оригинальный подход HibernateTemplate оказался трудным для отладки, так как он проглатывает и упаковывает полезные исключения; поговорите напрямую с Hiberante API!

Пожалуйста, продолжайте смотреть на сгенерированный SQL (настройте ведение журнала разработки для отображения SQL). Наличие уровня абстракции для базы данных не означает, что вам больше не нужно думать о SQL; Вы не получите хорошую производительность, если вы не так.

Рассмотрим проект. Я выбирал iBatis вместо Hibernate в нескольких случаях, когда у нас были строгие требования к производительности, сложные устаревшие схемы или хорошие DBa, способные писать отличный SQL.

2 голосов
/ 19 сентября 2008

Что касается Hibernate: очень хороший инструмент для приложений, который работает с быстро меняющейся схемой базы данных, большим количеством таблиц, выполняет множество простых операций CRUD. Отчеты со сложными запросами обрабатываются не так хорошо. Но в этом случае я предпочитаю смешивать в JDBC или нативных запросах. Итак, для краткого ответа: я думаю, что время, потраченное на изучение Hibernate, является хорошим вложением (говорят, что оно также соответствует стандартам EJB3.0 и JPA, но это не вошло в уравнение, когда я оценил его для своего личного использования).

Что касается весны ... см. Блог желчи :)

Помните: рамки не серебряные пули , но вы не должны изобретать колесо .

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