java - DDD : Can anyone explain the diffrences between DTO, 聚合根和分离实体?

标签 java jpa domain-driven-design microservices

我对弄清楚这三者之间的差异感到有点困惑。假设我有一个客户 -> 地址关系,(JPA)分离实体也将有这个关系(假设是热切加载)。哪里需要额外的聚合根?哪里需要DTO?一切都或多或少相同吗?

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

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

最佳答案

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

Aggregates mark off the scope within which invariants have to be maintaned at every stage of lifecycle. The following patterns, factories and repositories, operate on aggregates.

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

也许您的问题可以改写为:我应该将聚合根返回为分离实体还是DTO?答案是主观的,取决于您的环境。

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

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

关于java - DDD : Can anyone explain the diffrences between DTO, 聚合根和分离实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26611387/

相关文章:

java - 在域驱动的设计中,为什么要使用“聚合”对象?在设计聚合时将应用哪些关键原则?

java - 如何在使用列表在 map 中分组时过滤年龄

java - 从 Jython 控制标准输出/标准错误

java - Join 和 JoinSet 之间的 JPA 区别

c# - 领域驱动设计和 Entity Framework 4.1(代码优先)

php - 领域驱动设计和 ORM 限制

java - Java 基本概念

java - 将多个子DTO设计成单个请求Spring Boot

java - Criteria API 使用复杂的 where 子句创建查询

java - Jpa 对象中具有不同的参数