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

标签 java hibernate domain-driven-design

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. 拆分两个实体并使内部实体成为其自身的集合。现在它具有全局身份并且可以从外部世界寻址。
  2. 如果 (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/

相关文章:

java - 为什么即使事务已提交,EntityManager 也会关闭?

c# - Nhibernate/Domain 对象使用来自工厂的随机数据生成测试对象

java - 如何在Java中创建具有多种类型参数的方法?

java - play 2.0中没有play.test.FunctionalTest怎么写功能测试?

java - oracle SQL Hibernate一对一映射返回NullPointerException

hibernate - 提交事务是否关闭 session ?

c# - 我应该如何使用持久层的私有(private) setter 实现 DDD 实体?

c++ - 函数中的 gdb 局部变量

Java从列表中获取特定值并添加到其他列表

java - 在 Java 中从给定字符串派生/计算唯一哈希的最佳方法