Persistence DDD:持续聚合 让我们考虑典型的阶和 OrthItIt示例。假设OrderItem是订单聚合的一部分,则只能通过订单添加它。因此,要将新的OrderItem添加到订单,我们必须通过存储库加载整个聚合,向Order对象添加一个新项目,并再次保存整个聚合

Persistence DDD:持续聚合 让我们考虑典型的阶和 OrthItIt示例。假设OrderItem是订单聚合的一部分,则只能通过订单添加它。因此,要将新的OrderItem添加到订单,我们必须通过存储库加载整个聚合,向Order对象添加一个新项目,并再次保存整个聚合,persistence,domain-driven-design,aggregate,aggregateroot,persistence-ignorance,Persistence,Domain Driven Design,Aggregate,Aggregateroot,Persistence Ignorance,这似乎有很多开销。如果我们的订单有10个订单项怎么办?这样,只需添加一个新的OrderItem,我们不仅需要阅读10个OrderItems,而且还需要重新插入所有这10个OrderItems。(这是Jimmy Nillson在其DDD书中采用的方法。每次他想要持久化聚合时,他都会清除所有子对象,然后再次重新插入它们。由于数据库中的IDENTITY列,每次都会更改子对象的ID,这可能会导致其他问题。) 我知道有些人可能会建议在聚合根应用工作单元模式,以便它跟踪已更改的内容,并仅提交这些更改。但这违

这似乎有很多开销。如果我们的订单有10个订单项怎么办?这样,只需添加一个新的OrderItem,我们不仅需要阅读10个OrderItems,而且还需要重新插入所有这10个OrderItems。(这是Jimmy Nillson在其DDD书中采用的方法。每次他想要持久化聚合时,他都会清除所有子对象,然后再次重新插入它们。由于数据库中的IDENTITY列,每次都会更改子对象的ID,这可能会导致其他问题。)

我知道有些人可能会建议在聚合根应用工作单元模式,以便它跟踪已更改的内容,并仅提交这些更改。但这违反了持久性忽略(PI)原则,因为持久性逻辑正在泄漏到域模型中

以前有人想过这个吗


这不一定是个问题,一些ORM支持惰性列表。 例如 您可以加载order实体并将项目添加到Details集合,而不实际实现该列表中的所有其他实体

我认为N/Hibernate支持这一点


如果您正在编写自己的实体持久性代码,而不使用任何ORM,那么您的运气很差,您必须重新实现ORMappers免费提供给您的相同脏跟踪机制。

必须从数据库加载整个聚合,因为DDD假设聚合根确保聚合边界内的一致性。要检查这些规则,必须加载所有必要的数据。如果要求特定客户的订单价值不超过100000美元,则聚合根(订单)必须在保留更改之前检查此规则。这并不意味着必须加载所有现有项并汇总它们的值。订单可以维护现有项目的预先计算的总和,该总和在添加新项目时更新。这种检查业务规则的方法只需要在添加新项目时加载订单数据。

我不是100%确定这种方法,但我认为应用工作单元模式可能是答案。请记住,任何事务都应该在应用程序或域服务中完成,您可以使用已更改的聚合中的对象填充工作类/对象单元。之后,让UoW类/对象发挥魔力(当然,在某些情况下,构建适当的UoW可能很困难)

以下是对工作单元模式的描述:

工作单元跟踪您在业务事务期间所做的可能影响数据库的一切。完成后,它会计算出由于您的工作而需要修改数据库的所有操作


是的,(N)Hibernate支持将项目添加到延迟加载的集合中,并且只将添加的项目插入到数据库中。我知道这个问题在很多年前就得到了回答。这里有一个几乎重复的问题,它有一个很好的答案。