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());
}