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

Что является хорошей моделью для преобразования между спящими объектами и объектами передачи данных?

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

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

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

Несмотря на то, что кажется, что он добавит существенный объем кода в мой проект, это рассуждение кажется звуковым.

Есть ли хороший шаблон проектирования, который я могу использовать для преобразования объекта Hibernate (который реализует интерфейс) в DTO, который реализует один и тот же интерфейс?

Поэтому, предполагая, что оба из следующих инструментов "Книга", мне нужно будет преобразовать BookEntity.class в класс BookDTO.class, чтобы я мог позволить JAXB сериализоваться и возвращаться.

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

Есть ли какой-то интересный способ преобразования через отражение? Или шаблон "строителя", о котором я не думаю?

Должен ли я просто игнорировать шаблон DTO и передавать объекты вокруг?

4b9b3361

Ответ 1

Должен ли я просто игнорировать шаблон DTO и передать объекты вокруг?

Мои предпочтения обычно "да". Мне не нравится идея параллельных иерархий, созданных только ради архитектурной или чистоты слоя.

Первоначальная причина шаблона DTO была чрезмерной болтовней в приложениях EJB 1.0 и 2.0 при передаче сущностей EJB на уровень представления. Решение заключалось в том, чтобы объект entity bean попал в DTO.

Другой причиной, которая обычно дается для создания DTO, является запрет на изменение уровня представления. В этом случае DTO являются неизменяемыми объектами без какого-либо поведения. Они не делают ничего, кроме данных паром, на уровень представления.

Я бы сказал, что DTO - это шаблон Core J2EE, который становится анти-шаблоном.

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

Ответ 2

Должен быть противоположный взгляд среди всего веселого удара DTO.

tl; dr - Иногда это полезно.

Преимущество DTO заключается в том, что вам не нужно добавлять аннотации zillion к вашим классам домена.

Вы начинаете с @Entity. Не так плохо. Но тогда вам нужен JAXB, поэтому вы добавляете @XMLElement и т.д., А затем вам нужен JSON, чтобы вы добавляли такие вещи, как @JsonManagedReference для Jackson, чтобы делать правильные вещи с отношениями, которые вы добавляете и т.д. И т.д. И т.д. Ad infinitum.

Довольно скоро ваше POJO не так просто. Читайте о "домене, управляемом дизайном" когда-то.

Кроме того, вы можете "фильтровать" некоторые свойства, о которых вы не хотите знать.

Ответ 3

Мы не должны забывать, что объекты объектов нелегко обрабатывать, когда они находятся в управляемом состоянии. Это затрудняет их переход к форматам GUI. Точнее, дочерние объекты обрабатываются с нетерпением. Это не может быть сделано вне сеанса, исключения из кузиса. Таким образом, они либо должны быть выселены (отделены) от менеджера сущности, они должны быть преобразованы в соответствующие DTO. Если не считать курсовой, есть образец, о котором я не знаю, что я был бы очень рад узнать.

Ответ 4

Чтобы быстро создать DTO с похожим взглядом, без кучи дублирующего кода get/set вы можете использовать BeanUtils.copyProperties. Эта функция поможет вам быстро скопировать данные из DAO в класс DTO. Просто помните, что существует более чем одна общая библиотека, поддерживающая BeanUtils.copyProperties, но их синтаксис не то же самое.

Ответ 5

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

В нашем проекте JAXB размещены аннотированные POJO, которые отделены от аннотированных POJO JPA. Наша команда обсуждала, как лучше всего перемещать данные между двумя объектами (фактически структурами данных).

Вот возможность для людей:

Мы обнаружили и экспериментируем с Dozer, который обрабатывает (1) одно и то же имя, (2) сопоставление XML и (3) пользовательские преобразования как способы копирования данных между двумя POJO.

До сих пор было очень просто использовать.