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

StackOverflow https://stackoverflow.com/questions/4558233

Вопрос

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

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

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

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

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

Поэтому, предполагая оба следующих реализации «Книга», мне нужно было бы преобразовать Bookentity.class в BookDto.class, чтобы я мог позволить JAXB сериализовать и вернуться.

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

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

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

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

Решение

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

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

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

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

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

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

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

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

TL; DR - это иногда все еще полезно.

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

Вы начинаете с @Entity. Не так уж и плохо. Но тогда вам нужен JAXB, чтобы вы добавили @xmleLement и т. Д. - и тогда вам нужен JSON, чтобы вы добавили такие вещи, как @JsonManagedReerference, чтобы Джексон сделал правильные вещи с отношениями, тогда вы добавляете и т. Д. и т. Д. и т. Д. Ad Infinitum.

Довольно скоро ваш pojo больше не так прост. Читайте о «доменном дизайне» когда -нибудь.

Кроме того, вы можете «отфильтровать» некоторые свойства, о которых вы не хотите, чтобы представление знало.

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

Для быстрого создания «выглядящего» DTO, без кучи дублированного кода GET/SET, вы можете использовать Beanatils.copyproperties. Анкет Эта функция поможет вам быстро скопировать данные из DAO в класс DTO. Просто помните, что существует несколько общих библиотек, поддерживающих Beanatils.copyProperties, но их синтаксис не одинаковый.

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

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

Вот вариант для людей, чтобы рассмотреть:

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

Пока это было очень легко использовать.

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