建议transfer objects should not contain object references to other transfer objects。相反,他们应该使用其他传输对象的主键作为外键字段。
以订单和客户为实体的简单示例
显然,包含没有客户详细信息的订单列表的OrderListDTO将包含订购客户详细信息的外键。
复合DTO OrderWithCustomerDTO将具有对OrderDTO和CustomerDTO的对象引用。但是,在这种情况下,嵌入式OrderDTO本身是否有对其CustomerDTO的对象引用?或者它应该使用订购客户的主键吗?
对象引用的指示
一个优点是客户端可以直接使用传输对象,例如作为演示模型。我倾向于接受这种方法来处理总是完全自包含的传输对象,例如:具有相关DTO或完整树的复合DTO。客户可以依赖自我控制。客户端根本不需要对传输对象进行后处理。
将主键指示为外键
优点是内部和外部引用的处理方式相同。我倾向于要求这种方法用于可能包含外部引用的传输对象,例如带有外部childIds的子树。客户端必须遍历完整列表以解析外部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;
}
(我选择传输对象来封装来自客户端的域模型,并提供客户端特定的数据视图。)
答案 0 :(得分:3)
作为一般性建议,转让 对象不应包含对象 对其他对象的引用。代替, 他们应该使用主键 其他对象作为外键 字段。
您是否可以附加指向此推荐来源的链接?这对我来说至少不是显而易见的。
在我当前的项目中,我使用包含对象引用的传输对象。这很方便,我还没有遇到任何问题。