Java 引用实体标识符的DDD值对象

Java 引用实体标识符的DDD值对象,java,domain-driven-design,Java,Domain Driven Design,在域驱动设计(DDD)中,ValueObject具有以下定义 值对象是描述某种特征或特性的对象 属性,但不包含身份的概念 假设我有“客户”实体和“订单”实体。订单与客户机相关,因此通常我会在订单类中添加字段ClientId,因为我可能不会引用客户机实体本身。到目前为止还不错 现在我想知道是否可以创建一个值对象ClientInfo,它将包括客户机的名称、客户机状态,以及客户机ID?ClientInfo将是不可变的,只有clientName、clientStatus和clientId的getter

在域驱动设计(DDD)中,ValueObject具有以下定义

值对象是描述某种特征或特性的对象 属性,但不包含身份的概念

假设我有“客户”实体和“订单”实体。订单与客户机相关,因此通常我会在订单类中添加字段ClientId,因为我可能不会引用客户机实体本身。到目前为止还不错

现在我想知道是否可以创建一个值对象ClientInfo,它将包括客户机的名称、客户机状态,以及客户机ID?ClientInfo将是不可变的,只有clientName、clientStatus和clientId的getter


这就是一个带有实体标识符的值对象。这是否违反了值对象的定义,或者我在这里安全吗?

引用实体标识符的值对象可以。如果在中有两个具有相同信息的ClientInfo对象,它们将完全可以互换。它们是值,就像字符串或整数一样。

这很好,但不是值对象它是值对象!它没有自己的标识,它包含一个表示实体标识的值。表示ID的值仍然是一个ID,它唯一地绑定到客户端,它不仅仅表示值。我不同意,使用您的规则,值对象可以看起来与实体或域对象相同……它没有任何标识概念!它存储一个身份引用!如果将ID存储在字符串中,那么该字符串是值对象还是实体?这当然是一个价值对象。我不认为这个问题与参考问题重复。在这里,OP专门询问值对象中的ID,而不是实体/值对象的一般概念。这确实不是重复提到的问题,而是更具体地针对值对象及其约束。该定义谈到ValueObject没有标识的概念,这意味着ValueObject不应该有表示ValueObject的ID。但是,ValueObject可能包含引用实体的标识符