Подтвердить что ты не робот

Использует объекты передачи данных в ejb3, считается лучшей практикой

Хотя очевидно, что не все сценарии могут быть охвачены одним дизайном, обычно считается, что классы ORM должны быть переданы туда и обратно между презентационным и бизнес-уровнем (локальным или удаленным), заменяя необходимость в объектах передачи данных? Насколько я вижу, использование классов ORM представляет проблемы ненужной нетерпеливой загрузки, проблем управления контекстом и жесткой связи, но также экономит много времени и упрощает простую работу. Существует ли теперь стандартный подход, который в целом благоприятствует одному другому (для большинства ситуаций)?

4b9b3361

Ответ 1

Это очень интересный вопрос, и я исследовал и экспериментировал с ним через два года.

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

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

Пример:

  • Если вы использовали SEAM, вам нужно избегать сильно слоистой архитектуры, потому что у вас есть доступ к расширенному контексту сохранения. Другие веб-технологии без этой поддержки, как правило, работают лучше с DTO, который подготовил штат заранее.
  • Если вы отправляете удаленное сообщение, оно должно быть тонким и легким, DTO, как правило, работает лучше, чем объект с богатым доменом. Здесь вы можете подавлять прозрачно любые проблемы/поведение ORM.
  • Шаблон DTO имеет преимущество защиты ваших клиентов от изменений в домене. Это особенно важно, если ваше приложение является веб-сервисом, имеющим объект домена (сущность), который определяет ваш контракт, который может оставить вас в какой-то момент.

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

Ответ 2

Плотная муфта? Пожалуйста, объясните.

Что касается меня, то DTO - это Anti-Pattern. EJB3 позволяет нам использовать их. Вы можете просто заставить свою ленивую инициализацию перед отправкой Entity клиенту.

Конечно, если вам нужно только два из 30 полей для отправки клиенту, вы просто отправляете их. Но если все копии все время, как в моем текущем проекте, попытайтесь избавиться от этого DTO. Я не вижу причин использовать их. Вы отправляете бизнес-объект клиенту в качестве клиента. Зачем использовать обертку?

Ответ 3

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

Ответ 4

У меня есть несколько проблем с использованием объектов на уровне презентации:

  • Блокировка. В результате создается плотная блокировка между презентацией и моделью. Из-за дорогостоящих изменений в больших проектах даже невозможно. Современные инструменты еще не совсем понятны.

  • Безопасность. С объектами модели вы легко передаете различные данные идентификатора базы данных на свои веб-страницы. Это явная проблема безопасности. Используя dto:s, вы можете скрыть их на сервере с помощью очень простых карт сеансов.

  • Разница потребностей. Графические представления редко представляют собой списки объектов модели. Чаще всего это нечто большее, объединенные звери, guish. Потребности GUI, как правило, ползут к вашей модели, скрывающей ее.

  • Скорость. С сущностями каждое поле обрабатывается каждый раз, когда вы читаете/записываете их. Поскольку вы передаете их непосредственно на презентационный уровень, вам трудно попытаться оптимизировать ваши JPA-запросы - почти невозможно. Я определенно вернусь к прямому JDBC -access - как myBatis в будущих проектах. Таким образом, исключается ORM.

У меня есть проблемы с dto:s тоже:

  • Дополнительный код DAO.

Все рассмотренные, я буду голосовать за использование dto:s для всех проектов, исключая JPA тоже. Итак, мой стек становится чем-то вроде:

  • myBatis для доступа к базе данных
  • POJO как DTO: s
  • Безгосударственный EJB для моих услуг DAO.
  • StatefulEJB для бэкэнда GUI.
  • JSF для презентации.

Ответ 5

Я согласен с последним "говорящим", почему использовать обертку, когда в ejb3?? Мы строим довольно сложную систему без DTO, но используя Entities (JPA), она сработала. Было ясно...

Ответ 6

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

Такие ситуации могут наблюдаться при попытке заполнить теги Spring MVC, например, или аналогичные конструкции других компонентов GUI.

Кроме того, DTO - это очень хорошее место для размещения дополнительных аннотаций, таких как аннотации проверки или JAXB и т.д.