域对象是否与 JPA 实体相同?如果我有一个价值对象(例如美元钞票),我如何(甚至应该)将它作为参考对象存储在数据存储中?
域对象在某些情况下是实体而在其他情况下是值对象的微妙之处是什么?任何人都可以指导我找到一篇关于这方面的好论文吗?
域对象是否与 JPA 实体相同?如果我有一个价值对象(例如美元钞票),我如何(甚至应该)将它作为参考对象存储在数据存储中?
域对象在某些情况下是实体而在其他情况下是值对象的微妙之处是什么?任何人都可以指导我找到一篇关于这方面的好论文吗?
“域对象”是一个更具概念性的术语;“JPA 实体”是指用于实现域对象的特定技术。
通常域对象对应于您域中的名词(订单、发票、客户等)。通常我们认为这些更接近数据库而不是纯粹的数据传输对象。因此,例如,您可能会在用于实现域对象的类上看到 ORM 注释。
很多人以一种贫乏的方式实现域对象——主要是使用 ORM 映射的属性,但域对象本身没有真正的逻辑。他们将逻辑放在域服务中。
另一方面,领域驱动设计的支持者将逻辑放在领域对象上。
无论哪种方式,这些都是您系统中的域对象。
JPA 实体是您使用@Entity、@Column、@ManyToOne 等注释的类。这是一种实现域对象的方法。如上所述,您可能决定将域逻辑放在对象本身上。
在领域驱动设计的背景下,它们是不一样的。域对象可以是包含实体和值对象的聚合,并且应该忽略持久性。因此,它不应包含任何 JPA 注释。
不,领域对象是具有丰富行为的对象,代表了业务的相关概念。JPA 实体是持久性的技术解决方案。
域对象是否与 JPA 实体相同?
不,他们不是。
如果我有一个价值对象(例如美元钞票),我如何(甚至应该)将它作为参考对象存储在数据存储中?
我建议使用 @Embeddable 存储值对象。VO 不需要@Id,您应该只从父级引用它们(它们与父级存储在同一个表中)。如果是集合,请使用 @ElementCollection。
@Emedded 值对象在 Hibernate 中表现更好:
域对象在某些情况下是实体而在其他情况下是值对象的微妙之处是什么?
实体是由@Id 区分的对象,相反,值对象是由值区分的。值对象通常被实现为不可变的,而实体/域对象包含改变其状态的业务逻辑。
在某些业务案例中,您需要将域对象表示为值对象,即快照,例如,您可以将其传递给另一个聚合或在域事件中发布。
任何人都可以指导我找到一篇关于这方面的好论文吗?
书籍:实施领域驱动设计,Vaughn Vernon。