【问题标题】:How to update this aggregate in DDD way using hibernate?如何使用休眠以 DDD 方式更新此聚合?
【发布时间】:2021-12-16 22:54:51
【问题描述】:

我有这种情况:

@Entity
public class AggregateA {
    private String fieldA;  
    //around 15 simple fields similar to fieldA

    @OneToMany(mappedBy = "entityFieldA", fetchType= FetchType.EAGER)
    private Set<EntityA> entitiesList;
    
    void updateAggregate() {
       //chose appropriate entity from the list and delegate updating to the `EntityA` class.
       EntityA ent = getSomehow();
       ent.updateField2();
    }
}

@Entity
class EntityA {
    private String entityFieldA;
    private String entityFieldB;
    //few more simple fields here

    void updateField2() {
       //set appropriate field
    }
}

我想使用updateAggregate 更新EntityA 内的一些字段(因为我想通过聚合更新所有实体)但问题是如果我通过数据库获取聚合,我将获取这 15 个简单字段,而且我将与实体表连接,这会使性能复杂化。在此之前,有相当简单的贫血解决方案。 EntityA 有存储库,因此我们在完全不知道该更新的情况下获取实体并更新它们。在这种情况下,我们没有获取聚合,连接也没有。我们只获取实体对象列表并更新它们。

我认为也许 spring 数据投影可以帮助我,但在这种情况下,我需要创建新接口(使用我想要获取的字段),在这种情况下,我还将我的业务逻辑传播到数百万个地方。

有没有优雅的 DDD 方法来解决这个问题?我是否应该将数据层与业务 DDD 层解耦?

【问题讨论】:

    标签: java hibernate jpa domain-driven-design


    【解决方案1】:

    在我看来,Hibernate lazy loading 就是您要找的东西。
    “任何优雅的 DDD 方法来解决它”,没有解决方案来自 DDD,这纯粹是一个技术问题,DDD 告诉你什么是你的实体/聚合/行为,你如何在代码中具体化它们并不是太多的一部分DDD 世界。

    【讨论】:

    • 您好,谢谢您的回答。哪件事需要偷懒?我认为它与 DDD 有关,因为如果它是纯技术问题,我将为 EntityA 创建休眠存储库,获取这些实体的列表,更新它们等,但我不想那样做,因为那时在在那种情况下,我会在没有聚合的情况下更新实体(不应该这样做,因为所有实体都应该通过聚合更新)。
    • 您可以将聚合中的entitiesList 标记为休眠中的惰性列表,以便在您访问它时自动获取它。我说这是一个技术问题,因为这是一个性能问题,而不是模型问题。你说过,DDD 关心的是从根进行的更改,以原子方式存储聚合。问题在于连接,这是因为选择存储数据的技术和选择获取数据的技术。
    • 我的意思是可以找到针对此类问题的解决方案,寻找特定的技术,而不是通用的 DDD 东西,因为有很多不同的方法可以改变使用的技术,提供很多的不同解决方案。我在这里看到的 DDD 是它指导您选择技术特性,以便其“规则”是真实的(例如,聚合以原子方式存储)
    • 问题是我需要那个 entityList 来更新它,但我不需要来自聚合的数据。我只需要获取 entityList,更新它并提交它。我不需要更改与根相关的内容。在那种情况下,懒惰帮不了我。我同意问题在于性能,但在这种情况下,由于性能原因,我似乎无法使用 DDD。
    • 啊抱歉我弄错了,以为问题是相反的。这是一个有趣的问题 :) 我在想你是否可以在他们的实体中创建所有其他字段并使其延迟加载(或查看 hibernate 的可嵌入+延迟加载)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多