Вопрос

Допустим, я решил пойти с стеком Java EE для моего корпоративного приложения.

Теперь для моделирования домена (или: для проектирования M MVC), какие API могут я могу безопасно предположить и использовать, а какие я должен держаться подальше от ... Сказать, через слой абстракции?

Например,

  1. Должен ли я идти вперед и помет мою модель с звонками в API Hibernate / JPA? Или я должен построить абстракцию ... настойчивый слой самого, чтобы избежать жесткого кодирования против этих двух удельных API на постоянство? Почему я спрашиваю это: Немедленно несколько лет назад был этот API KODO, который заменил гибернатом. Если кто-то разработал слой настойчивости и закодировал оставшуюся часть модели к этому слою (вместо того, чтобы засорение модели с вызовами на конкретную API поставщику позволило бы легко переключиться от KODO в Hibernate в XYZ.

  2. Рекомендуется ли создать агрессивное использование * QL, предоставляемую вашим поставщиком настойчивости в вашей области домена? Я не знаю о любых реальных проблемах (таких как производительность, масштабируемость, переносимость и т. Д.), Вытекающие из тяжелого использования языка, подобного HQL. Почему я спрашиваю это: Я хотел бы избежать, как можно больше, написание пользовательского кода, когда то же самое можно было выполнить через язык запроса, который более портативный, чем SQL.

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

Это было полезно?

Решение

Вот что я считаю традиционным видом:

  • Предприятия в вашем проекте образуют модель домена. Они должны быть многоразовыми и не тесно связаны с технологией настойчивости (я вернусь позже о туго против свободной муфты)
  • Бизнес-слой, использует модель домена, но также предоставляет услуги и другие вещи.
  • Слой доступа к данным отвечает для сохранения модели домена (объектов) в постоянном магазине.

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

Если вы сопоставьте, что в Java EE Technologies вы обычно получаете что-то вроде:

  • Сущности -> Pojo с аннотациями Hibernate / JPA. Обратите внимание, что аннотации не подразумевают жесткой связи с JPA / Hibernate, тот же POJO может быть использован где-то еще без гибернации.
  • Бизнес-слой -> сессия EJB или весна
  • Слой доступа к данным -> JPA / Hibernate

Это грубый эскиз, и есть много возможных вариантов. Вы можете пропустить сеанс EJB и реализовать бизнес-слой другого способа. Вы также можете решить, что бизнес-сайт вызова сеанса JPA / Hibernate / EntityManager напрямую, в каком случае JPA / Hibernate на самом деле является DAL, или вы можете обернуть доступ к сеансу / EntiteManager в так называемые объекты доступа к данным (DAO ).

Что касается HQL, попробуйте придерживаться того, что портативно, и если вы используете нативный SQL, следуйте конвенциям SQL-92. Если вещи усложняются, возможно, внедрить DAOS. Таким образом, вы знаете, что единственное место, где есть QQL-запросы, находится в даасе. Вы также можете сначала реализовать логику запросов «процедурно» в DAO, и если у вас есть проблемы с производительностью, повторно реализовать его с более сложным запросом HQL.

РЕДАКТИРОВАТЬ

Что касается ваших вопросов в комментарии:

Бизнес-слой зависит от слоя данных. Если вы хотите, чтобы бизнес-слой не зависел от Hibernate / JPA, то ваш слой данных надо Аннотация Hibernate / JPA прочь. Если вы используете DAO для вашего слоя данных, это будет так. Дао будет «тонкий слой настойчивости вручную над гибернатом» (чтобы взять ваши слова). Я бы представил DAO для всех объектов в вашем случае.

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

Тем не менее, вот список ресурсов, которые вас могут заинтересовать: книги Узор архитектуры приложения предприятия, книга Реальные шаблоны Java EE - переосмысление лучших практик, книга Дизайн приводной домена и более конкретно шаблоны Объект доступа к данным, Рисунок репозитория, Открытый сеанс ввиду (если это для веб-приложения), и, возможно, Модель анемии домена.

Редактировать 2

Хорошо, еще несколько предложений о транзакциях:

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

С EJB3 транзакции могут быть объявлены с аннотациями и приложением. Сервер управляет этим для вас. Видеть Этот другой ответ мой для получения дополнительной информации. С весной вы также можете представить транзакции, но я не знаю деталей. В противном случае вам нужно будет начать / остановить транзакцию самостоятельно. Это будет немного отличается, используете ли вы JDBC транзакции или транзакции JTA.

Транзакции также относится к ленивой погрузке в Hibernate / JPA. Сущность, которая была ленивной загруженной, действительно может быть загружен только в том случае, если есть текущая транзакция. Если транзакции прекращаются в бизнес-уровне, сущности, которые возвращаются на презентационный слой, необходимо с нетерпением загружаться.

Чтобы обойти эту проблему, популярный шаблон для веб-приложений Открытый сеанс ввиду, который я уже упоминал. В этом случае презентационный слой запускается / останавливает транзакции (которые немного не так концептуально), но работает просто отлично с ленивой погрузкой.

Другие советы

Ваша доменная модель и его слой настойчивости должны быть в теории быть отдельными - нет необходимости в классе Entity Чтобы узнать что-нибудь о том, если и как оно сохраняется, так что вы можете использовать что-то вроде Hibernate, чтобы создать слой настойчивого времени, не загрязняя самим классами модели домена. Вы не «кодируете модель [...] по сравнению с этим слоем» - вы кодируете модель, затем сопоставьте ее в постоянный магазин со каким-то слоем ORM, где модель домена не зависит от слоя ORM. Очевидно, что слой настойчивости будет зависеть от модели домена, но это нормально.

Я лично бороться с застенчивым использования слишком много HQL с (N) Hibernate по той причине, по которой вы спрашиваете, но есть времена, когда оно неизбежно. Вы уже знаете, а вы подчеркивались, главная проблема там, поэтому вы вряд ли в любом случае чрезмерно чрезмерно чрезмерно чрезмерно

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top