Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns orm和java中的DDD实体_Design Patterns_Domain Driven Design - Fatal编程技术网

Design patterns orm和java中的DDD实体

Design patterns orm和java中的DDD实体,design-patterns,domain-driven-design,Design Patterns,Domain Driven Design,我开始阅读E.Evans DDD的第5章,试图了解这些概念的头绪 在ddd的上下文中,什么是实体,什么不是实体,什么是值对象 看看——但这是关于Hibernate的,不是DDD,我问的是DDD 在上面的hibernate示例中,OrderLine是实体,但OrderLine仍然是DDD实体吗 更一般地说,我们能说任何jpa/Hibernate@实体都是DDD实体吗 在我看来,OrderLine是Jpa/Hibernate的一个很好的例子 不是DDD实体的实体,是吗 例如,如果我们使用某个对象数据

我开始阅读E.Evans DDD的第5章,试图了解这些概念的头绪

在ddd的上下文中,什么是实体,什么不是实体,什么是值对象

看看——但这是关于Hibernate的,不是DDD,我问的是DDD

  • 在上面的hibernate示例中,OrderLine是实体,但OrderLine仍然是DDD实体吗
  • 更一般地说,我们能说任何jpa/Hibernate@实体都是DDD实体吗
  • 在我看来,OrderLine是Jpa/Hibernate的一个很好的例子 不是DDD实体的实体,是吗
  • 例如,如果我们使用某个对象数据库,我们可能会将Order与它的OrderLines存储在一起,不是吗

  • 在关系数据库方面,我们可以说,在数据库中映射为OnDeleteCascade的Jpa@实体不是DDD实体,但它仍然是一个值对象吗
  • hibernate@Embedded是否始终是DDD值对象?(似乎是的,它没有身份)
  • 好的,现在是另一个有疑问的案例。假设我们有两个不同的系统,一个是Java系统,另一个是Python系统。一个用于计费,另一个用于营销。它们都有一个客户实体

  • 我们是否说BillingCustomer与MarketingCustomer是同一DDD实体(假设他们都代表同一个客户John Doe born 01.01.1980和ssn 12-34-56)?这意味着在java中,两个不同的类,即使没有公共的父类(除了Object),也可以表示相同的DDD实体。如果是这样,那么在上述类中应该如何实现equals
  • 对于表示同一DDD实体的两个不同java类,java equals是否应该返回true
  • 人们常说实体是可变的,值对象是可变的 不变的

  • 我们将如何使用java和hibernate实现以下功能:

    @实体Person有@Embedded Address,Person类有getter和 setter和Address-only-getter?为了改变地址,我们 喜欢某人做某事 (Address.builder(person.getAddress()).setStreet(“newStreet”).build()) ?


  • 寻找所有这些问题的客观答案可能很困难,因为存在多种相互矛盾的解释

    一般来说,DDD实体和值对象与ORM实体和值有一些相似之处,但它们是非常不同的概念。两个主要原因是:

    • 两者所指的“身份”是不同的。数据库具有与数据库相关的标识,这些标识很少与业务相关标识匹配,尤其是在非规范化时
    • ORM和持久性通常是一种技术,与“业务”无关
    • DDD实体和值对象是对象而不是数据。我的意思是,它们通常应该符合面向对象的原则,其中之一是对象应该关注行为而不是数据。这通常会导致对其施加完全不同的力
    由于这些原因,而且可能还有其他原因,永远不应该将ORM混合到“真正的”业务对象中

    考虑到这些,让我们回答你的问题:

  • 不,Hibernate实体永远不应该是DDD实体
  • 不是,JPA/Hibernate实体永远不应该是DDD实体
  • 否,JPA实体/值对象与DDD对象没有直接关系
  • 没有,没有亲戚
  • 不,对象的标识可以指纯概念性的东西
    BillingCustomer
    MarketingCustomer
    在概念上是不同的,因此它们永远不会相等,即使它们背后的“真正”人是相同的。一般来说,“真实”在软件设计中有不同的含义。我们认为所有的“真实”都是企业的一部分(即无处不在的语言的一部分),即使其中一些甚至大部分不是传统意义上的“真实”。
  • 不,equals()也应该符合正常的Java规则。不同类别的对象永远不应该相等。这将非常令人困惑。定义另一个关系,例如
    matches()
    ,或
    sameCustomer()
    ,等等
  • 我不知道你的意思

  • HTH.

    寻找所有这些问题的客观答案可能很困难,因为存在多种相互矛盾的解释

    一般来说,DDD实体和值对象与ORM实体和值有一些相似之处,但它们是非常不同的概念。两个主要原因是:

    • 两者所指的“身份”是不同的。数据库具有与数据库相关的标识,这些标识很少与业务相关标识匹配,尤其是在非规范化时
    • ORM和持久性通常是一种技术,与“业务”无关
    • DDD实体和值对象是对象而不是数据。我的意思是,它们通常应该符合面向对象的原则,其中之一是对象应该关注行为而不是数据。这通常会导致对其施加完全不同的力
    由于这些原因,而且可能还有其他原因,永远不应该将ORM混合到“真正的”业务对象中

    考虑到这些,让我们回答你的问题:

  • 不,Hibernate实体永远不应该是DDD实体
  • 不是,JPA/Hibernate实体永远不应该是DDD实体
  • 否,JPA实体/值对象与DDD对象没有直接关系
  • 没有,没有亲戚
  • 不,对象的标识可以指纯概念性的东西
    BillingCustomer
    MarketingCustomer
    在概念上是不同的,因此它们永远不会相等,即使它们背后的“真正”人是相同的。一般来说,“真实”在软件设计中有不同的含义。我们认为所有的“真实”都是企业的一部分(即无处不在的语言的一部分),即使其中一些甚至大部分不是传统意义上的“真实”。
  • 不,equals()也应该符合