java - 领域驱动设计中的 JPA 实体责任
问题描述
我想知道 JPA 实体和 DDD 实体是否应该是同一个类?我可以在示例中看到这是一种常见的做法,但它是否违反了单一责任原则?
解决方案
我想知道 JPA 实体和 DDD 实体是否应该是同一个类?我可以在示例中看到这是一种常见的做法,但它是否违反了单一责任原则?
您可能需要查看Robert Martin 的Classes vs Data Structures。
我通常会期望 JPA 实体是“贫血的数据包”;它们本质上是写在过去的消息,供将来使用。
另一方面,领域模型实体并不乏力——他们直接了解如何根据其服务领域的规则改变自己的数据结构。
在 DDD 书中,Evans 描述了使用“工厂”模式从原始数据创建域实体的实例。该模式同样适合从 jpa 实体创建域实体。
另一个方向的转换 - 获取域实体并从中提取您需要保存的数据,没有明确解决,但机制是相同的。您从域实体中读取数据,并将其写入您的 jpa 实体(是否写入新的 jpa 实体,或更新已存在的实体,将取决于您的持久性策略的细节)。
如果您尝试使两个实体“相同”,则不能保证会弄得一团糟,但是肯定存在不同的问题。
例如,我们对数据的持久表示应该有一个跨越多个版本的生命周期,我们的域模型的新版本应该可以处理我们以前存储的数据。同时,我们应该能够自由地改变我们在领域模型中使用的数据结构。从语义上讲,它是相同的信息,但对结构和组织的压力却大不相同。
推荐阅读
- r - 错误:'\l' 是从 "' 开始的字符串中无法识别的转义
\l" - python - 为什么 Tesseract 不能正确识别文本?
- docker - 如何下载 npm 依赖项作为 Docker 构建的一部分
- attributeerror - AttributeError:“函数”对象没有属性“x0”
- bash - Bash 日期减法 +%H:%M:%S
- unity3d - 在 Unity 中重置字符位置不起作用
- node.js - RangeError:WebAssembly.instantiate():内存不足:wasm 内存
- html - 使用引导程序在容器内对齐步进器 div
- spring - 如何平衡正在运行的 Pod 上的共享表记录?
- html - Break After 没有视觉效果