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

时间:2012-05-01 07:11:36

标签: jpa domain-object

域对象是否与JPA实体相同?如果我有一个值对象(例如一个美元账单),我怎么能(甚至应该)将它作为参考对象存储在数据存储区中?

域对象在某些情况下是实体的微妙之处,在其他情况下是值对象?有人能指导我写一篇好文章吗?

4 个答案:

答案 0 :(得分:6)

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

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

很多人以贫血的方式实现域对象 - 主要是具有ORM映射的属性,但域对象本身没有真正的逻辑。他们把逻辑放在域名服务中。

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

  

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

不,他们不是。

  

如果我有一个价值对象(例如美元钞票),我怎么能(甚至应该)将其作为参考对象存储在数据存储区中?

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

@Emedded Value Objects在Hibernate中表现更好:

  • 如果您不使用@OneToOne,则没有JOINS。
  • 可以使用一个DELETE删除值对象集合,并且在删除之前不必加载。
  

域对象在某些情况下是实体的细微之处是什么,在其他情况下是值对象?

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

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

  

有人能指导我写一篇好文章吗?

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