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

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

Простой пример с Заказом и Заказчиком в качестве сущностей

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

Составной DTO OrderWithCustomerDTO будет иметь ссылки на объекты для OrderDTO и CustomerDTO. Но должен ли в этом случае встроенный OrderDTO иметь ссылку на объект для CustomerDTO? Или он должен использовать первичный ключ клиента заказа?

Индикация для ссылки на объект

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

Указание первичных ключей как внешних ключей

Преимущество заключается в том, что внутренние и внешние ссылки обрабатываются одинаково. Я склонен требовать такой подход для объектов передачи, которые могут содержать внешние ссылки, например поддерево с внешними дочерними идентификаторами. Клиент должен выполнить итерацию по всему списку, чтобы разрешить внешние childIds.

Более сложный пример с деревом или поддеревом

Теперь рассматриваемый объект передачи - это дерево или поддерево. Технически это список узлов.

Это нормально, если узлы в передающем объекте ссылаются друг на друга ссылками на объекты, такими как NodeTOWithObjectReferences ниже?

public class NodeTOWithObjectReferences implements Serializable {
    private long id;
    private NodeTOWithObjectReferences parent;
    private List<NodeTOWithObjectReferences> children;
}

Или передающий объект должен заменить КАЖДУЮ ссылку на объект полем внешнего ключа, как показано ниже NodesTOWithForeignKeys?

public class NodesTOWithForeignKeys implements Serializable {
    private List<NodeDetail> children;
}

public class NodeDetail implements Serializable {
    private long id;
    private long parentId;
    private List<Long> childIds;
}


(Я выбрал объекты переноса, чтобы инкапсулировать модель домена от клиентов и предоставить клиенту определенные представления данных.)

1 ответ

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

Не могли бы вы прикрепить ссылку на источник этой рекомендации? По крайней мере, это не очевидно для меня.

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

Другие вопросы по тегам