【问题标题】:How to use AbstractAggregateRoot<T> or the annotation DomainEvents with Java Records如何将 AbstractAggregateRoot<T> 或注释 DomainEvents 与 Java 记录一起使用
【发布时间】:2021-10-17 19:56:24
【问题描述】:

我正在尝试发展一个域,其中包含并使用 Java Records 实现了 Aggregate-root,但我无法找到一种方法来使用 Domain Event 概念从一个 Aggregate-root 传播事件。 https://docs.spring.io/spring-data/jdbc/docs/current/reference/html/#core.domain-events

以下语法的编译问题:

import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Table;
import org.springframework.data.domain.AbstractAggregateRoot;

@Table("BALANCE")
public record Balance extends AbstractAggregateRoot<Balance> (

    @Id
    @Column("ID_BALANCE")
    Long balanceId,

    @Column("BALANCE")
    BigDecimal balance,

    @Column("ID_CUSTOMER")
    Long customerId,

    @Column("LAST_UPDATE")
    Timestamp lastUpdate,

    @Column("WITHDRAW_LIMIT")
    BigDecimal withdrawLimit
) {
//Business logic
}

这个语法没问题:

import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Table;
import org.springframework.data.domain.AbstractAggregateRoot;

public class BalanceDemo extends AbstractAggregateRoot<BalanceDemo> {

    @Id
    @Column("ID_BALANCE")
    Long balanceId;

    @Column("BALANCE")
    BigDecimal balance;

    @Column("ID_CUSTOMER")
    Long customerId;

    @Column("LAST_UPDATE")
    Timestamp lastUpdate;

    @Column("WITHDRAW_LIMIT")
    BigDecimal withdrawLimit;

    //Constructors, Get, HashCode, Equals, toString
    //Business Logic
}

怎么了?是不是不能结合Domain Events使用Java记录?

【问题讨论】:

  • 我对 Spring Data 了解得不够多,无法说出这是否可能以某种方式实现,但记录不能扩展诸如 AbstractAggregateRoot 之类的类,因为它们都扩展了 java.lang.Record。但是,在问题链接的文档中,该示例没有扩展AbstractAggregateRoot,因此也许有一些方法可以使其工作。

标签: java spring-data domain-driven-design spring-data-jdbc


【解决方案1】:

正如 Tim Moore 在评论中所写,Java Record 不能扩展另一个类,因为它已经隐式扩展了 java.lang.Record

因此,您可以将AbstractAggregateRoot 中的相关代码复制到您的记录中,或者在您的记录中拥有它的一个实例,并在相关的方法实现中委托给它。

【讨论】:

    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2019-10-14
    相关资源
    最近更新 更多