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

Объекты JPA и /vs DTO

Какова общая идея помочь решить, когда использовать DTO и когда использовать Entity в этих случаях?

  • Пользовательский интерфейс/сервер, вызывающий службы. Должен ли он получать/отправлять объекты или DTO?
  • Веб-сервис, вызывающий службы. Должны ли службы принимать сущности или DTO?

Мне нравится читать код, который передает объекты вокруг:

  • проще проехать, нет необходимости сопоставлять DTO
  • не нужны дополнительные классы
  • отношения с другими объектами уже определены, поэтому не нужно комбинировать связанные DTO в один DTO
  • только POJO

Но есть аргументы о DTO, которые сопоставляются с сущностью, более безопасны, потому что это контракт, и сущность может перейти в любую форму, а DTO останется неизменным. Например, например, у объекта есть имя поля, а DTO также имеет имя поля. Позже, если требование изменится, изменится таблица базы данных, объект может также измениться, изменив имя на firstName и lastName. Но DTO все равно будет иметь имя поля, которое является первымName + lastName.

Итак, вот список плюсов использования DTO:

  • обратная совместимость с точки зрения кода, который принимает DTO

Против DTO, о которых я могу думать, есть:

  • должны определять классы DTO и отображение (возможно, с помощью бульдозера)
  • программистам придется анализировать, когда использовать DTO и сущность, я имею в виду, что передача DTO для всех методов - это беспорядок.
  • накладные расходы на преобразование объектов в DTO и наоборот
  • im все еще не уверен в отношении отношений "один ко многим" о том, как их сопоставить. В JPA мы можем ленив инициализировать это, но при передаче в DTO следует инициализировать это или нет. Вскоре DTO не имеют ленивых инициализированных прокси-серверов, они содержат только значения.

Прошу поделиться своими мыслями.

Спасибо!

Вот несколько цитат из разных мест

pro dto:

Повторное использование класса сущности как DTO кажется грязным. Открытый API класса (включая аннотации для общественности методы) более четко не определяет Целью договора является Предъявление. Класс закончится тем, что методы, которые имеют значение только тогда, когда класс используется как DTO и некоторые методы, которые будут relavent, когда класс используется как сущность. Обеспокоенность не будет чисто разделены, и все будет более плотно соединены. Для меня это более важное рассмотрение дизайна затем пытается сэкономить на количестве созданных файлов класса.

pro entity:

Абсолютно НЕ!!!

Объекты JPA отображаются в базу данных, но они не привязаны к базе данных. Если база данных изменяется, вы меняете отображения, а не объекты. объекты остаются неизменными. Что целая точка!

4b9b3361

Ответ 1

Я бы пошел на опцию DTO по следующим причинам:

  • Сервисный интерфейс должен быть независимым от базы данных, изменение в одном не должно всегда требовать изменения в другом.
  • Вы делаете предположение, что ваши службы всегда будут вызываться клиентом Java
  • Использование ленивой загрузки, когда объект находится на другой стороне вызова веб-службы, не работает.

Ответ 2

Pro DTO: 1. UI в большинстве случаев требует определенных свойств, которые предназначены только для передачи аргументов, изображающих состояние пользовательского интерфейса. Это состояние не требуется, чтобы оно сохранялось, а не требовалось использовать для сущностей.
2. Бизнес-логика должна быть внутри сущностей или в вспомогательных классах для entites. Вы не должны делиться этим с интерфейсом UI/Presentation Layer или с клиентом, вызывающим его.
3. Изменение сущностей иногда не требует изменения DTO и наоборот.
4. Легче выполнять проверки уровня системы на DTO в сервисах пользовательского интерфейса, следовательно, останавливая вызов в Business Services, когда это не стоит.
5. Вы можете свободно реализовывать/использовать другие рамки проверки, когда сторона пользовательского интерфейса получает DTO, а не объект, заполненный данными, поступающими из пользовательского интерфейса.
6. Интерфейс UI/Presentation слабо связан.

Вот пример потока, когда используются DTO:
UI → MVC → Системные проверки с использованием служб пользовательского интерфейса → Бизнес-делегат → Бизнес-услуги → Сохранять.