Должны ли DTO в составном DTO ссылаться друг на друга по первичному ключу или по ссылке на объект? - PullRequest
4 голосов
/ 19 февраля 2011

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

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

Очевидно, 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 Ответ

3 голосов
/ 19 февраля 2011

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

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

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

...