Java 如何删除Axon上的AggregateMember?

Java 如何删除Axon上的AggregateMember?,java,cqrs,axon,Java,Cqrs,Axon,我有一个聚合的组织,它可以有多个地址。因此,我们将这个OrganizationDeliveryAddress建模为聚合成员。在OrganizationDeliveryAddress上,我们为实体本身命令和事件源处理程序 以下是我当前的实现: 聚合 公营班级组织{ 私有@AggregateIdentifier @非空UUID organizationId; @聚合成员 private final List deliveryAddresses=new ArrayList(); @命令处理程序 上的公

我有一个聚合的
组织
,它可以有多个地址。因此,我们将这个
OrganizationDeliveryAddress
建模为聚合成员。在
OrganizationDeliveryAddress
上,我们为实体本身命令和事件源处理程序

以下是我当前的实现:

聚合 公营班级组织{ 私有@AggregateIdentifier @非空UUID organizationId; @聚合成员 private final List deliveryAddresses=new ArrayList(); @命令处理程序 上的公共UUID(AddOrganizationDeliveryAddressCommand命令){ val addressId=UUID.randomUUID(); val event=new OrganizationDeliveryAddressAddEvent(command.getOrganizationId(),addressId,command.getAddress()); AggregateLifecycle.apply(事件); 返回地址ID; } @EventSourcingHandler (OrganizationDeliveryAddressAddedEvent事件)上的公共无效{ val地址=新的OrganizationDeliveryAddress(event.getOrganizationDeliveryAddressId(),false); deliveryAddresses.add(地址); } } 公共类组织DeliveryAddress{ private@EntityId @非空UUID organizationDeliveryAddressId; @命令处理程序 上的公共无效(RemoveOrganizationDeliveryAddressCommand命令){ AggregateLifecycle.apply(新的OrganizationDeliveryAddressRemovedEvent(命令.getOrganizationId(),文件名), getOrganizationDeliveryAddressId()); } @EventSourcingHandler (@SuppressWarnings(“未使用”)OrganizationDeliveryAddressRemovedEvent事件)上的公共无效{ if(organizationDeliveryAddressId.equals(event.getOrganizationDeliveryAddressId())){ AggregateLifecycle.markDeleted(); } } } 我们想删除其中一个地址,但看起来不只是地址,而是整个聚合都被删除了


因此,我的问题是:如何指示Axon Framework删除
OrganizationDeliveryAddress
Aggregate成员?

AggregateMember本身不是一个聚合,而只是另一个聚合的成员。这就是为什么如果调用
AggregateLifecycle.markDeleted()它会将聚合本身标记为已删除

要“删除”一个
AggregateMember
,您应该执行与添加它相反的操作,这意味着您可以在聚合上使用一个
@EventSourcingHandler
方法来侦听
OrganizationDeliveryAddressRemovedEvent
。此方法将负责在您的聚合成员(
DeliveryAddress
)上找到正确的DeliveryAddress,或者更好地找到您将在下面看到的
Map
,并将其从中删除。伪代码可以是这样的:

// Organization.java
...
@AggregateMember
private final Map<UUID, OrganizationDeliveryAddress> deliveryAddressItToDeliveryAddress = new HashMap<>();
...
@EventSourcingHandler
public void on(@SuppressWarnings("unused") OrganizationDeliveryAddressRemovedEvent event) {
    Assert.isTrue(deliveryAddressItToDeliveryAddress.containsKey(event.getOrganizationDeliveryAddressId()), "We do not know about this address");
    deliveryAddressItToDeliveryAddress.remove(event.getOrganizationDeliveryAddressId());
}
//Organization.java
...
@聚合成员
private final Map deliveryAddressItToDeliveryAddress=new HashMap();
...
@EventSourcingHandler
(@SuppressWarnings(“未使用”)OrganizationDeliveryAddressRemovedEvent事件)上的公共无效{
Assert.isTrue(deliveryAddressItToDeliveryAddress.containsKey(event.getOrganizationDeliveryAddressId()),“我们不知道这个地址”);
deliveryAddressItToDeliveryAddress.remove(event.getOrganizationDeliveryAddressId());
}

聚合成员本身不是一个聚合,而只是另一个聚合的成员。这就是为什么如果调用
AggregateLifecycle.markDeleted()它会将聚合本身标记为已删除

要“删除”一个
AggregateMember
,您应该执行与添加它相反的操作,这意味着您可以在聚合上使用一个
@EventSourcingHandler
方法来侦听
OrganizationDeliveryAddressRemovedEvent
。此方法将负责在您的聚合成员(
DeliveryAddress
)上找到正确的DeliveryAddress,或者更好地找到您将在下面看到的
Map
,并将其从中删除。伪代码可以是这样的:

// Organization.java
...
@AggregateMember
private final Map<UUID, OrganizationDeliveryAddress> deliveryAddressItToDeliveryAddress = new HashMap<>();
...
@EventSourcingHandler
public void on(@SuppressWarnings("unused") OrganizationDeliveryAddressRemovedEvent event) {
    Assert.isTrue(deliveryAddressItToDeliveryAddress.containsKey(event.getOrganizationDeliveryAddressId()), "We do not know about this address");
    deliveryAddressItToDeliveryAddress.remove(event.getOrganizationDeliveryAddressId());
}
//Organization.java
...
@聚合成员
private final Map deliveryAddressItToDeliveryAddress=new HashMap();
...
@EventSourcingHandler
(@SuppressWarnings(“未使用”)OrganizationDeliveryAddressRemovedEvent事件)上的公共无效{
Assert.isTrue(deliveryAddressItToDeliveryAddress.containsKey(event.getOrganizationDeliveryAddressId()),“我们不知道这个地址”);
deliveryAddressItToDeliveryAddress.remove(event.getOrganizationDeliveryAddressId());
}