建议传输对象不应包含对其他传输对象的对象引用。相反,他们应该使用其他传输对象的主键作为外键字段。
以 Order 和 Customer 作为实体的简单示例
显然,一个 OrderListDTO 包含一个没有客户详细信息的订单列表,将包含订购客户详细信息的外键。
复合 DTO OrderWithCustomerDTO 将具有对 OrderDTO 和 CustomerDTO 的对象引用。但是在这种情况下,嵌入式 OrderDTO 本身是否应该具有对其 CustomerDTO 的对象引用?还是应该使用订购客户的主键?
对象引用指示
一个优点是客户端可以直接使用传输对象,例如作为表示模型。我倾向于接受这种方法来传输始终完全自包含的对象,例如具有相关 DTO 的复合 DTO 或完整树。客户端可以依赖自包含。客户端根本不需要对传输对象进行后处理。
将主键指示为外键
优点是内部和外部引用的处理方式相同。我倾向于使用这种方法来传输可能包含外部引用的对象,例如具有外部 childIds 的子树。客户端必须遍历完整列表以解析外部 childId。
带有树或子树的更复杂示例
现在讨论的传输对象是树或子树。从技术上讲,它是一个节点列表。
如果传输对象中的节点通过对象引用(如下面的 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;
}
(我选择传输对象来封装来自客户端的域模型并提供客户端特定的数据视图。)