需要在子实体中定义命令处理程序和EventSourcingHandler

问题描述

*我正在尝试将命令处理程序和EventSourcingHandler迁移到tableB类的映射类。另外,我正在定义命令处理程序和事件,如下所示。请建议如何将命令处理程序从TableA迁移到TableB类(具有嵌入的主键)

使用轴突的概念进行以下实现。它正在当前的实施中*

     @Data
        @Aggregate(repository = "tableARepository")
        @NoArgsConstructor
        @EqualsAndHashCode(onlyExplicitlyIncluded = true)
        @Entity(name = "tableA")
        @Table(name = "tableA")
        public class TableA{
            @EmbeddedId
            @AggregateIdentifier
            @EqualsAndHashCode.Include
            private tableAId id;
        
        
            @AggregateMember(eventForwardingMode = ForwardMatchingInstances.class)
            @OnetoOne(fetch = LAZY,cascade = PERSIST,mappedBy = "tableA",orphanRemoval = true)
            private TableB tableB;
        
            @CommandHandler
            public void handle(UpdateTableA command) {
                apply(new TableBUpdatedEvent(command.getAresReferenceId()));
            }
        
            @CommandHandler
            public void handle(@SuppressWarnings("unused") DeleteTableBCommand command) {
                apply(new TableADeletedEvent());
            }
        
            @EventSourcingHandler
            void on(TableAUpdatedEvent event) {
                getTableB().getTableBPK().setId(getId());
                getTableB().setReferenceId(event.getAresReference());
            }
        
            @EventSourcingHandler
            void on(TableBDeletedEvent event) {
                getTableB().setReferenceId(null);
            }
        
        }
        @Data
        @Entity(name = "TableB ")
        @Table(name = "TableB ")
        @EqualsAndHashCode(onlyExplicitlyIncluded = true)
        public class TableB {
        
            @EntityId
            @EqualsAndHashCode.Include
            @EmbeddedId
            @AttributeOverrides({ @AttributeOverride(name = "id",column = @Column(name = "ID")),@AttributeOverride(name = "system",column = @Column(name = "SUB_SYstem")) })
            TableBPK tableBPK;
        
            @Column(name = "ID")
            private String referenceId;
        
            @Column(name = "CREATION_DATE")
            @CreationTimestamp
            private LocalDateTime creationDate;
        
            @OnetoOne(optional = false)
            @JoinColumn(name = "table_ID",insertable = false,updatable = false)
            private Dossier TableA ;
        
            // This is used by lombok to use the getClass instead of instanceOf for equality
            public boolean canEqual(Object other) {
                return other != null && getClass() == other.getClass();
            }
        
        }
    
    @Data
    @Embeddable
    @NoArgsConstructor
    @requiredArgsConstructor(staticName = "of")
    public class TableBPK implements Serializable {
    
        @NonNull
        @Embedded
        @EqualsAndHashCode.Include
        private tableAId Id;
    
        @Column(name = "SUB_SYstem")
        @Getter(AccessLevel.PRIVATE)
        @Setter(AccessLevel.PRIVATE)
        private Integer system = 11;
    
    }
      
   class TableBDeletedEvent
   data class TableBUpdatedEvent(val aresReference: String)
   data class UpdateTableBCommand(@field:NotNull @field:TargetAggregateIdentifier val id: tableAId ?,@field:NotNull val aresReferenceId: String)
   data class DeleteTableBCommand(@field:NotNull @field:TargetAggregateIdentifier val id: tableAId ?)

解决方法

通过将它们从TableA类中删除并将它们添加到TableB类中,您应该能够简单地做到这一点。 Axon中没有什么可以阻止您移动该代码,因此应该就是这样。

尽管如此,在查看示例代码时,我只注意到UpdateTableADeleteTableBCommand命令。在您不是代码领域专家的情况下,我只能想到将DeleteTableBCommandTableA移到TableB。但是,如上所述,您只需移动代码即可。 Axon不在乎。

如果您在设置中遇到更具体的问题,建议通过指定什么在移动这些处理程序时不起作用来进一步完善您的问题。