问题描述
*我正在尝试将命令处理程序和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中没有什么可以阻止您移动该代码,因此应该就是这样。
尽管如此,在查看示例代码时,我只注意到UpdateTableA
和DeleteTableBCommand
命令。在您不是代码领域专家的情况下,我只能想到将DeleteTableBCommand
从TableA
移到TableB
。但是,如上所述,您只需移动代码即可。 Axon不在乎。
如果您在设置中遇到更具体的问题,建议通过指定什么在移动这些处理程序时不起作用来进一步完善您的问题。