如何使用 AbstractAggregateRoot<T> 或注解 DomainEvents with Java Records

How to use AbstractAggregateRoot<T> or the annotation DomainEvents with Java Records

我正在尝试发展一个域,其中包含它并使用 Java 记录实现聚合根,但我无法找到一种方法来使用 Domain Event 概念从一个传播事件聚合根。 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
}

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

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

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