public class AggregateRoot {
private Integer id;
private Set<Child> children;
}
public class Child {
private Integer id;
private String name;
}
假设您需要保存 Child
并将他的 ID 发送到某个外部系统。在 DDD 中,您将使用与此类似的代码保存 child :
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。
DB 生成的 ID
由于您遇到的原因,使用数据库生成的 ID 不适合 DDD。最好的方法通常是使用生成的随机 ID。 This answer有关于该主题的更多信息。
边注
通过阅读您的问题,我得到的印象是您采用了一种以数据库为中心的方法(使用数据库生成的 ID 就是一个迹象)。 在使用 DDD 时,首先尝试关注领域模型并围绕它构建数据库基础架构。
关于java - DDD 在使用 Hibernate 保存后找出子元素的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34814890/