orm和Java中的DDD实体

时间:2018-07-27 19:53:21

标签: design-patterns domain-driven-design

我开始阅读E. Evans DDD的第5章,并尝试使这些概念引人注目。

在ddd中,什么是实体,什么不是实体,什么是值对象?

看着Value object or entity object in my Hibernate mapping?-但这是关于Hibernate而不是DDD的,我问DDD

  1. 在上面的休眠示例中,OrderLine是Entity,但是OrderLine仍然是DDD实体吗?
  2. 更笼统地说,我们可以说任何jpa / Hibernate @Entity是DDD实体吗?
  3. 在我看来,OrderLine是Jpa / Hibernate的一个很好的例子 不是DDD实体的实体,是吗?

例如,如果我们使用了某个对象数据库,我们可能会将Order togeter与OrderLines一起存储,不是吗?

  1. 关于关系数据库,我们可以说,在数据库中映射为OnDeleteCascade的Jpa @Entity不是DDD实体,但它仍然是值对象吗?
  2. 休眠@Embedded始终是DDD值对象吗? (似乎是,它没有身份)

好,现在还有其他疑问。可以说我们有两个不同的系统,一个是Java,另一个是Python。一种用于计费,另一种用于营销。他们两个都有一个客户实体。

  1. 我们是否说BillingCustomer和MarketingCustomer是同一个DDD实体(假设他们都代表同一位客户John Doe,生于1980年1月1日,年龄为12-34-56岁)?这意味着在Java中,两个不同的类,即使没有共同的父类(Object除外)也可以表示相同的DDD实体。如果是这样,应该如何在上述类中实现等式?
  2. 对于表示同一DDD实体的两个不同的Java类,java equals应该返回true吗?

通常写成实体是可变的,而值对象是     一成不变的。

  1. 我们如何在下面用java和hibernate实现:

    @Entity Person具有@Embedded Address,Person类具有getter和 设置者和仅地址获取者?并更改地址街道,我们 会像person.setAddress这样 (Address.builder(person.getAddress())。setStreet(“ newStreet”)。build()) ?

1 个答案:

答案 0 :(得分:1)

由于存在多种矛盾的解释,因此很难找到所有答案的客观答案。

尽管通常,DDD实体和值对象与ORM实体和值有些相似,但是它们是非常不同的概念。两个主要原因是:

  • 两者中提到的“身份”是不同的。数据库事物具有与数据库相关的身份,很少与与业务相关的身份匹配,尤其是在非规范化时。
  • ORM和持久性通常是一种技术,与“业务”无关。
  • DDD实体和值对象是不是数据的对象。我的意思是说,它们通常应该遵循面向对象的原则,其中之一是对象应该关注的是行为而不是数据。这通常会导致完全不同的作用力施加于它们。

由于这些要点,也许还有其他要点,所以永远不要将ORM混入“真实”业务对象中。

请记住所有这些,让我们回答您的问题:

  1. 否,休眠实体永远不能是DDD实体。
  2. 不是,JPA /休眠实体永远不能是DDD实体。
  3. 正确。
  4. 不,JPA实体/值对象与DDD对象没有直接关系。
  5. 不,没有关系。
  6. 不,对象的身份可以指纯粹的概念性事物。 BillingCustomerMarketingCustomer在概念上是不同的事物,因此即使它们背后的“真实”人是相同的,它们也永远不会相等。通常,“真实”在软件设计中具有不同的含义。我们认为属于业务一部分(即无所不在语言的一部分)的所有“真实”内容,即使从传统意义上讲,甚至部分甚至大部分都不是“真实”的。
  7. 不,equals()也应符合常规Java规则。不同类的对象永远不能相等。这将非常令人困惑。定义另一个关系,例如matches()sameCustomer()等。
  8. 不知道你的意思。

HTH。