首页 > 解决方案 > 领域驱动设计中的 JPA 实体责任

问题描述

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

标签: javajpadomain-driven-designsingle-responsibility-principle

解决方案


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

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

我通常会期望 JPA 实体是“贫血的数据包”;它们本质上是写在过去的消息,供将来使用。

另一方面,领域模型实体并不乏力——他们直接了解如何根据其服务领域的规则改变自己的数据结构。

在 DDD 书中,Evans 描述了使用“工厂”模式从原始数据创建域实体的实例。该模式同样适合从 jpa 实体创建域实体。

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

如果您尝试使两个实体“相同”,则不能保证会弄得一团糟,但是肯定存在不同的问题。

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


推荐阅读