编程语言
首页 > 编程语言> > java-用Hibernate保存后DDD找出​​子元素的ID

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

作者:互联网

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时,请尝试首先关注域模型并围绕该域模型构建数据库基础结构.

标签:domain-driven-design,hibernate,java
来源: https://codeday.me/bug/20191027/1944682.html