DDD在使用Hibernate保存后找出子元素的ID

mom*_*ilo 5 java domain-driven-design hibernate

public class AggregateRoot {
     private Integer id;

     private Set<Child> children;
}

public class Child {
     private Integer id;
     private String name;
}
Run Code Online (Sandbox Code Playgroud)

想象一下,您需要保存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());
Run Code Online (Sandbox Code Playgroud)

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

the*_*Dmi 5

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

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

对非聚合根实体的引用

DDD 建议聚合根带有全局 ID,而“内部”实体 ID 仅具有本地意义。因此,您不应单独公开内部 ID,因为它不会唯一寻址实体。

  1. 拆分两个实体并使内部实体成为其自身的集合。现在它具有全球身份,并且可以从外部世界进行寻址。
  2. 如果 (1) 在您的域中没有意义,请将组合 ID 公开给外部系统。您必须能够将组合 ID 分为聚合根 ID 和(本地)内部实体 ID。

数据库生成的 ID

由于您遇到的原因,使用 DB 生成的 ID 不适合 DDD。最好的方法通常是使用生成的随机 ID。此答案包含有关该主题的更多信息。

边注

通过阅读您的问题,我的印象是您采取了一种以 DB 为中心的方法(使用 DB 生成的 ID 是一种迹象)。使用 DDD 时,尽量先关注领域模型,然后围绕它构建数据库基础设施。