领域驱动设计中的 JPA 实体责任

JPA entity responsibility in domain driven design

我想知道 JPA 实体和 DDD 实体是否应该相同 class? 我可以在示例中看到这是一种常见的做法,但这是否违反了单一职责原则?

由于一定程度的便利性,我认为这是一种常见的做法,但它的设计并不是特别简洁。在大多数情况下,JPA 实体与域对象匹配或至少足够接近是巧合。

JPA 是对持久数据层的抽象,其核心重点是提供对象到关系数据的映射。因此,JPA 实体实际上仅表示 data 模型的对象层次结构。

很可能您的域对象只包含在持久数据存储中表示和存储的元素,如果创建包含完全相同数据结构的域和 JPA 实体,这感觉有点像重复。

真正的域对象位于应用程序架构的中心,所有依赖项都指向它们,这也包括数据层。我总是推荐这种方法,纯粹是因为它阐明了架构边界的实际意图。

编辑。 要回答关于 JPA 中违反 SRP 的问题的第二部分 - 这取决于。职责(在 SRP 中)确实倾向于匹配关系 table,因为我们倾向于在逻辑上将相关数据分组在一起(想想客户 table,或联系人 table)。尽管在考虑关系(员工 -> 薪水)时,这在 JPA 中确实更常见。

I am wondering if JPA entity and DDD entity should be the same class? I can see in examples that it is a common practice, but doesn't it violate single responsibility principle?

您可能想要查看 Robert Martin 的 Classes vs Data Structures

我通常希望 JPA 实体是 "anemic bags of data";它们本质上是 消息 写在过去以供将来使用。

另一方面,域模型实体并不贫血——它们直接了解如何根据它们所服务的域的规则来改变它们自己的数据结构。

在 DDD 书中,Evans 描述了使用 "factory" 模式从原始数据创建域实体的实例。该模式同样适用于从 jpa 实体创建域实体。

另一个方向的转换——获取域实体并从中提取您需要保存的数据,没有明确解决,但机制是相同的。您从域实体中读取数据,并将其写入您的 jpa 实体(是写入一个新的 jpa 实体,还是更新一个已经存在的实体,将取决于您的持久性策略的细节)。

如果您尝试制作这两个实体,不一定会弄得一团糟"the same",但肯定有不同的顾虑。

例如,我们对数据的持久表示预计会有一个跨越多个版本的生命周期,我们领域模型的新版本应该可以处理我们以前存储的数据。同时,我们应该能够自由地改变我们在领域模型中使用的数据结构。语义上是一样的信息,但是结构和组织上的压力却大不相同