域对象是否与JPA实体相同?

域对象是否与JPA实体相同?,jpa,domain-object,Jpa,Domain Object,域对象是否与JPA实体相同?如果我有一个值对象(例如一张美元钞票),我如何(甚至应该)将其作为引用对象存储在数据存储中 域对象在某些情况下是实体,而在其他情况下是值对象,这有什么微妙之处?有谁能给我介绍一篇关于这方面的好论文吗?“域对象”是一个概念性更强的术语;“JPA实体”指用于实现域对象的特定技术 通常,域对象对应于域中的名词(订单、发票、客户等)。通常,我们认为它们更接近数据库,而不是纯粹的数据传输对象。例如,您可能会在用于实现域对象的类上看到ORM注释 很多人实现域对象的方式都很贫乏——

域对象是否与JPA实体相同?如果我有一个值对象(例如一张美元钞票),我如何(甚至应该)将其作为引用对象存储在数据存储中

域对象在某些情况下是实体,而在其他情况下是值对象,这有什么微妙之处?有谁能给我介绍一篇关于这方面的好论文吗?

“域对象”是一个概念性更强的术语;“JPA实体”指用于实现域对象的特定技术

通常,域对象对应于域中的名词(订单、发票、客户等)。通常,我们认为它们更接近数据库,而不是纯粹的数据传输对象。例如,您可能会在用于实现域对象的类上看到ORM注释

很多人实现域对象的方式都很贫乏——大多数属性都使用ORM映射,但域对象本身没有真正的逻辑。他们将逻辑放在域服务中

另一方面,领域驱动设计的支持者将逻辑放在领域对象上

无论哪种方式,这些都是系统中的域对象


JPA实体是用@Entity、@Column、@manytone等注释的类。这是实现域对象的一种方法。您可以决定将域逻辑放在对象本身上,如上所述。

在域驱动设计的上下文中,它们是不同的。域对象可以是包含实体和值对象的聚合,并且应该忽略持久性。因此,它不应该包含任何JPA注释。

不,域对象是具有丰富行为的对象,表示业务的相关概念。JPA实体是持久性的技术解决方案

域对象是否与JPA实体相同

不,他们不是

如果我有一个值对象(例如一张美元钞票),我如何(甚至应该)将其作为引用对象存储在数据存储中

我建议使用@Embeddeble存储值对象。VO不需要@Id,您应该只从父级引用它们(它们存储在与父级相同的表中)。如果是集合,请使用@ElementCollection

@eMeded Value对象在Hibernate中性能更好:

  • 如果不使用@OneToOne,则没有联接
  • 值对象集合可以通过一次删除删除,并且在删除之前不必加载
域对象在某些情况下是实体,而在其他情况下是值对象,这有什么微妙之处

实体是通过@Id区分的对象,相反,值对象是通过值区分的。值对象通常被实现为不可变的,而实体/域对象包含改变其状态的业务逻辑

在某些业务案例中,您需要将域对象表示为值对象(也称为快照),例如,将其传递给另一个聚合或在域内发布事件

谁能告诉我一篇关于这方面的好论文吗


书籍:实施域驱动设计,Vaughn Vernon。

是的,域对象与JPA实体相同。如果您处于域驱动设计环境中,它们就不同了,因为域对象往往比“贫乏”对象更健壮。检查是什么阻止您将域逻辑放入实体中?这不正是将表行映射到实际对象的首要目的吗?否则,您也可以使用HashMaps来表示表中某一行的数据。