Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 复合DTO中的DTO应该通过主键或对象引用相互引用吗?_Oop_Design Patterns_Architecture_Dto_Data Transfer Objects - Fatal编程技术网

Oop 复合DTO中的DTO应该通过主键或对象引用相互引用吗?

Oop 复合DTO中的DTO应该通过主键或对象引用相互引用吗?,oop,design-patterns,architecture,dto,data-transfer-objects,Oop,Design Patterns,Architecture,Dto,Data Transfer Objects,有一项建议是:。相反,它们应该使用其他传输对象的主键作为外键字段 以订单和客户为实体的简单示例 显然,包含没有客户详细信息的订单列表的OrderListDTO将包含订购客户详细信息的外键 复合DTO OrderWithCustomerTo将具有对OrderDTO和CustomerTo的对象引用。但是在这种情况下,嵌入的OrderDTO本身是否应该有一个对其CustomerDTO的对象引用?还是应该使用订购客户的主键 对象引用的指示 一个优点是客户端可以直接使用传输对象,例如,作为表示模型。对于总

有一项建议是:。相反,它们应该使用其他传输对象的主键作为外键字段

以订单和客户为实体的简单示例

显然,包含没有客户详细信息的订单列表的OrderListDTO将包含订购客户详细信息的外键

复合DTO OrderWithCustomerTo将具有对OrderDTO和CustomerTo的对象引用。但是在这种情况下,嵌入的OrderDTO本身是否应该有一个对其CustomerDTO的对象引用?还是应该使用订购客户的主键

对象引用的指示

一个优点是客户端可以直接使用传输对象,例如,作为表示模型。对于总是完全自包含的传输对象,我倾向于接受这种方法,例如带有相关DTO的复合DTO或完整树。客户可以依靠自我约束。客户端根本不需要对传输对象进行后期处理

主键指示为外键

优点是内部引用和外部引用的处理方式相同。对于可能包含外部引用的传输对象,我倾向于使用这种方法,例如带有外部子ID的子树。客户端必须遍历完整列表以解析外部子ID

更复杂的树或子树示例

现在讨论的传输对象是树或子树。从技术上讲,它是一个节点列表

如果传输对象中的节点通过对象引用(如下面的NodeTOWithObjectReferences)相互引用,是否可以

public class NodeTOWithObjectReferences implements Serializable {
    private long id;
    private NodeTOWithObjectReferences parent;
    private List<NodeTOWithObjectReferences> children;
}
公共类NodeTOWithObjectReferences实现可序列化{
私人长id;
private NodeTOWithObjectReferences父节点;
私人名单儿童;
}
或者传输对象必须用外键字段替换每个对象引用,如下面的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;
}
public类nodestowithforeignkey实现可序列化{
私人名单儿童;
}
公共类NodeDetail实现可序列化{
私人长id;
私人长父ID;
私人名单儿童;
}

(我选择transfer对象来封装来自客户端的域模型,并提供特定于客户端的数据视图。)

作为一般性建议,转让 对象不应包含对象 对其他对象的引用。相反 他们应该使用 将其他对象作为外键 田地

你能附上一个链接到这个建议的来源吗?这至少对我来说并不明显

在我当前的项目中,我使用包含对象引用的传递对象。这种方法很方便,而且我还没有遇到任何问题。

其中说:“传输对象决不能包含或引用复合传输对象;相反,只要可能,传输对象应该使用主键引用其他传输对象。”我觉得我的例子的反常之处在于树的自我参照。复合对象具有对其建筑对象的对象引用。一个只包含订单的列表具有客户的外键。但是,如何让一份清单与订购客户一起订购?