2017-01-31 9 views
0

У меня есть проект Api для отдыха, в котором используется база данных размером от 25 до 30 таблиц. Этот проект был создан с использованием отчетов JDBC Prepared. Проект огромен. Поскольку я знал, что спящий режим лучше для обслуживания, я думал, что должен перейти на Hibernate ORM. У меня есть промежуточный опыт в Hibernate. После того, как я начал работать, мне пришлось создавать классы POJO, которые отличаются от предыдущих классов pojo, потому что аннотация hibernate использует классы bean с сопоставлением для других таблиц. Его становится беспорядочным везде, меняя все. Стоит ли мигрировать в Hinernate ORM после моего проекта на 90%?Стоит переместиться в Hibernate ORM из JDBC Подготовленные заявления после завершения проекта на 90%?

  • Объекты "Мой бизнес" меняются.
  • Дао отличается от предыдущих.
  • Контроллер Также нуждается в модификациях.
+0

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

+0

@ KrzysztofCichocki, пожалуйста, продумайте немного? –

+1

Изменение кода доступа к БД в огромном 90% -ном проекте будет таким же, как открытие окна пандоры с непонятными и страшными ошибками, ожидающими увидеть дневной свет, эти ошибки (количество и неопределенность их) будут есть ваше время и, вероятно, прибыль от проекта. –

ответ

1

Учитывая, что вы на 90% завершены, это, безусловно, не то, что я спешу немедленно сделать. Я бы продолжал поддерживать вашу нынешнюю стратегию реализации, по крайней мере, на данный момент.

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

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

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

  • моделей Persistence (это ваши @Entity классов)
  • модели домена (это то, что ваши услуги принимают в качестве входных данных и возвращать в качестве выхода)
  • Посмотреть модели (это то, что контроллеры принимают в качестве входных данных и возвращать в качестве выходного сигнала)

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

  • Контроллер принимает вид-модель и отображает ее на модель домена
  • Контроллер требует обслуживания вашей модели домена
  • служба вызывает хранилище с моделью предметной области
  • Repository занимает модель предметной области и карты это модель инерционности
  • Repository вызовы Hibernate с моделью инерционности

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

Как минимум, стоит разделить модели просмотра и настойчивости. Это позволяет моделировать структуру вашего хранилища данных, где это имеет наибольший смысл, позволяя использовать вариант для полностью другого открытого интерфейса REST. Таким образом, по мере того, как требования изменяются на любом конце спектра, они могут делать это, только имея дело с кодом сопоставления, который находится между ними.

+0

Я ценю ваш ответ. Но можете ли вы дать мне общее представление о том, как модель домена (которая у меня есть в настоящее время) может быть сопоставлена ​​с моделью персистентности (классы @ @ Entity, которые будут сгенерированы инструментами спящего режима)? .. Спасибо. –

+0

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

+0

Всегда есть компромиссы @KrzysztofCichocki. В рамках, над которыми я работаю, его общий характер, чтобы отвлечь модель определенного слоя от других слоев, чтобы избежать непреднамеренного воздействия внутренних элементов, которые не должны быть доступны. Тот же аргумент может быть сделан и в этом случае. Уверены, что вы можете повторно использовать одни и те же классы сущностей, но, как я указываю, очень важно разоблачить ваше представление с использованием разных моделей, чтобы по крайней мере вход/выход приложения мог развиваться со временем без ненужной связи с вашей моделью данных. Бывают случаи, когда это не так важно, но это редкость – Naros