Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.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
Java 有人能解释DTO、聚合根和分离实体之间的区别吗?_Java_Jpa_Domain Driven Design_Microservices - Fatal编程技术网

Java 有人能解释DTO、聚合根和分离实体之间的区别吗?

Java 有人能解释DTO、聚合根和分离实体之间的区别吗?,java,jpa,domain-driven-design,microservices,Java,Jpa,Domain Driven Design,Microservices,我对弄清楚这三者之间的区别有点困惑。假设我有一个客户->地址关系(JPA)分离实体也会有这个关系(假设)。哪里需要额外的聚合根?哪里需要DTO?一切都差不多吗 原因之一可能是符合JPA的实体有一些客户根本不感兴趣的信息,例如@Entity,@Id,@OneToMany 我可以使用JAX-RS/-WS轻松地将其转换为JSON/XML,并且几乎每个客户机都可以处理它,那么,在哪里需要它呢?一切都差不多,还是我错过了一些重要的事情?嗯,我真的不明白你真正需要什么?您尝试使用DDD概念或DTO解决的问题

我对弄清楚这三者之间的区别有点困惑。假设我有一个客户->地址关系(JPA)分离实体也会有这个关系(假设)。哪里需要额外的聚合根?哪里需要DTO?一切都差不多吗

原因之一可能是符合JPA的实体有一些客户根本不感兴趣的信息,例如
@Entity
@Id
@OneToMany


我可以使用JAX-RS/-WS轻松地将其转换为JSON/XML,并且几乎每个客户机都可以处理它,那么,在哪里需要它呢?一切都差不多,还是我错过了一些重要的事情?

嗯,我真的不明白你真正需要什么?您尝试使用DDD概念或DTO解决的问题是什么

DTO与聚合根(也是一个实体)不可比,一个实体有数据和行为(DTO不是这种情况,它只是数据)

因此,域模型应该是域驱动的;-),并且一些构建块可以用来实现它,例如:实体、聚合。。。当您使用ORM时,很难隔离您的域,因此您必须尝试在您的域中使用噪声尽可能少的纯对象。解决这个问题有很多策略


你可以在那里找到更多信息:

嗯,我真的不明白你真正需要什么?您尝试使用DDD概念或DTO解决的问题是什么

DTO与聚合根(也是一个实体)不可比,一个实体有数据和行为(DTO不是这种情况,它只是数据)

因此,域模型应该是域驱动的;-),并且一些构建块可以用来实现它,例如:实体、聚合。。。当您使用ORM时,很难隔离您的域,因此您必须尝试在您的域中使用噪声尽可能少的纯对象。解决这个问题有很多策略

您可以在那里找到更多信息:

无论您是否使用JPA,如果您遵循DDD原则,您都将创建聚合根目录。这是DDD中非常基本的构建块之一。来自Eric Evan的DDD书:

聚合标记了不变量的范围 在生命周期的每个阶段进行维护。以下模式, 工厂和存储库在聚合上运行

DTO和分离实体与JPA(技术约束)相关。聚合根也是一个实体。当聚合根变得不受管理时(通过持久性上下文),它被称为分离实体

也许您的问题可以重新表述为:我应该将聚合根作为分离实体或DTO返回吗?答案是主观的,取决于您的环境

将聚合根作为分离实体返回的好处是不需要创建新的DTO类。您还可以调用聚合根所拥有的方法。缺点是,出于性能原因,您通常不会填充完整的对象图,因为某些聚合根可能具有很深的层次结构。如果处理不当,这将导致延迟加载异常

返回DTO而不是聚合根被认为是更健壮的设计。您需要为聚合根的每个“用例”创建一个新的DTO类。这对于小型系统来说可能太麻烦了,但如果您使用DDD,我相信您的需求是复杂的。

无论您是否使用JPA,如果您遵循DDD原则,您都将创建聚合根目录。这是DDD中非常基本的构建块之一。来自Eric Evan的DDD书:

聚合标记了不变量的范围 在生命周期的每个阶段进行维护。以下模式, 工厂和存储库在聚合上运行

DTO和分离实体与JPA(技术约束)相关。聚合根也是一个实体。当聚合根变得不受管理时(通过持久性上下文),它被称为分离实体

也许您的问题可以重新表述为:我应该将聚合根作为分离实体或DTO返回吗?答案是主观的,取决于您的环境

将聚合根作为分离实体返回的好处是不需要创建新的DTO类。您还可以调用聚合根所拥有的方法。缺点是,出于性能原因,您通常不会填充完整的对象图,因为某些聚合根可能具有很深的层次结构。如果处理不当,这将导致延迟加载异常


返回DTO而不是聚合根被认为是更健壮的设计。您需要为聚合根的每个“用例”创建一个新的DTO类。这对于小型系统来说可能太麻烦了,但如果您使用的是DDD,我相信您的需求很复杂。

AggregateRoot不属于DDD?六羟甲基三聚氰胺六甲醚。。。我没想到我错了这么多。不幸的是,马丁·福勒也被误导了。无论如何我想知道我的服务接口是否。。。属于微服务的那个。。。应该返回一个分离的实体,还是应该将其转换为相关的实体图。。。区别是什么,好处在哪里。。。只有一个提示,我的朋友:在否决投票之前,试着澄清一下,好吗?啊,我在考虑查询根。看来我完全没有资格回答你的问题:)很抱歉给你带来不便。没问题,谢谢你的努力;-)AggregateRoot不属于DDD?六羟甲基三聚氰胺六甲醚。。。我没想到我错了这么多。不幸的是,马丁·福勒也被误导了。无论如何我想知道我的服务接口是否。。。属于微服务的那个。。。应该返回一个分离的实体,还是应该将其转换为相关的实体图。。。区别是什么,好处在哪里。。。只是o