Hibernate DDD-域实体(aggreagate),包含另一个实体的大量集合

Hibernate DDD-域实体(aggreagate),包含另一个实体的大量集合,hibernate,jpa,domain-driven-design,Hibernate,Jpa,Domain Driven Design,在下面的场景中 class Group { ... Set<User> users; ... } 这听起来像是一个合理的解决方案,但又不违反DDD的原则吗?在这种情况下,是否存在被过度关注的优化 您似乎缺少了GroupMember的概念 GroupMember member = group.addUser(user); groupMemberRepository.add(member); 现在,您可能会说“您不能有重复的组成员身份”之类的不变量不能以强一致

在下面的场景中

class Group {
    ...
    Set<User> users;
    ...
}

这听起来像是一个合理的解决方案,但又不违反DDD的原则吗?在这种情况下,是否存在被过度关注的优化

您似乎缺少了
GroupMember
的概念

GroupMember member = group.addUser(user);
groupMemberRepository.add(member);
现在,您可能会说“您不能有重复的组成员身份”之类的不变量不能以强一致的方式强制执行,因为没有聚合根在所有成员身份周围都有边界

虽然业务规则确实不能在域中强制执行,但您可以简单地依赖数据库中的唯一约束(假设存储机制支持它们)

这是一个折衷方案,我们可以做出这样的折衷,以保持强烈的一致性和实用性,而不是成为一个纯粹主义者

然而,还有另一种选择,但这需要深入的业务分析。我们通常倾向于将业务规则视为数学模型,但现实生活往往无法如此建模

拥有重复会员资格的风险和影响是什么?这是否可以简单地手动识别和纠正?这条规则最终能否保持一致(自动化流程消除重复)?这种情况真的会发生多久


我相信这些都是您需要回答的问题,您通常会意识到,业务往往比您想象的更灵活,最终的一致性往往是一个可行的解决方案。

在这种情况下,我认为需要集团来维护一个集团成员集合。这可能会再次成为一个巨大的集合,假设要对集合执行这样的操作,其中代价是巨大的,那么我的上述解决方案是否有效。(PS:很抱歉没有提到我的问题更多的是关于特定组用户域的大型集合,这更像是我选择的一个例子)@SomasundaramSekar“在这种情况下,我认为该组需要维护一个组成员集合。这可能会再次成为一个大型集合”我不明白你的意思。。。我刚刚展示了两种建模方法,而不需要让组保留集合。您提出的解决方案基本上与我的第一个建议相同,但您的实现与DDD不太一致。您不应该对存储库执行业务命令。我描述的方法可以用于任何类型的关系。。。e、 g.
ProductCategorization cat=product.categorize(someCategory);productCategorizationRepository.add(cat)
如果一个产品可以用数千个类别进行分类,那么使用这种方法也许是有意义的。谢谢@plalx,我明白了。引用完整的
用户
对象并不是对其建模的唯一方法——仅仅拥有一个ID列表如何?这是当
User
是聚合根目录时的建议。此外,我认为您应该在事务级别上考虑聚合设计。庞大的对象集合不仅效率低下,而且还会在拥有它的聚合中引起大量争用。每个想要在给定的
组中编辑
用户
的人都必须在同一
上启动事务,如果存在多个并发事务,则可能会导致锁定问题。
GroupMember member = group.addUser(user);
groupMemberRepository.add(member);