public class AggregateRoot {
     private Integer id;

     private Set<Child> children;
}

public class Child {
     private Integer id;
     private String name;
}

想象一下,您需要保存Child并将其ID发送到某个外部系统。在DDD中,您将使用与以下代码相似的代码来保存子代码:
AggregateRoot aggregateRoot = aggregateRootRepository.getById(id);
Child child = new Child();
child.setName("Sun");
aggregateRoot.addChild(child);
aggregateRootRepository.save(aggregateRoot);
externalService.postSavedChildId(child.getId());

当然child.getId()将返回null,因为它不在持久性上下文中。知道如何在DDD中处理这种情况吗?

最佳答案

您的情况有两个问题,我将分别解决:

  • 我们应该如何分发非聚合根实体的ID?
  • 使用数据库生成的ID时,如何在保存之前获取实体的ID?

  • 对非汇总根实体的引用

    DDD建议聚合根带有全局ID,而“内部”实体ID仅具有局部意义。因此,您不应仅公开内部ID,因为它不会唯一地寻址实体。
  • 拆分两个实体,并使内部实体成为其自身的集合。现在,它已具有全局性,并可以从外部世界访问。
  • 如果(1)在您的域中没有意义,请向外部系统公开一个组合的ID。您必须能够将组合的ID分为聚合根ID和(本地)内部实体ID。

  • 数据库生成的ID

    出于您遇到的原因,使用DB生成的ID不太适合DDD。最好的方法通常是使用生成的随机ID。 This answer有关该主题的更多信息。

    边注

    通过阅读您的问题,我得到的印象是您采取了一种以DB为中心的方法(使用DB生成的ID就是一种证明)。 在使用DDD时,请尝试首先关注域模型并围绕该域模型构建数据库基础结构。

    关于java - 用Hibernate保存后DDD找出​​子元素的ID,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34814890/

    10-10 00:06
    查看更多