Настройка среды: Axon 4.4, H2Database (мы проводим тестирование компонентов в рамках CI). Код выглядит примерно так.
@Aggregate(repository = "ARepository")
@Entity
@DynamicUpdate
@Table(name = "A")
@Getter
@Setter
@NoArgsConstructor
@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false)
@Log4j2
Class A implements Serializable {
@CommandHandler
public void handle(final Command1 c1) {
apply(EventBuilder.buildEvent(c1));
}
@EventSourcingHandler
public void on(final Event1 e1) {
//some updates to the modela
apply(new Event2());
}
@Id
@AggregateIdentifier
@EntityId
@Column(name = "id", length = 40, nullable = false)
private String id;
@OneToMany(
cascade = CascadeType.ALL,
fetch = FetchType.LAZY,
orphanRemoval = true,
targetEntity = B.class,
mappedBy = "id")
@AggregateMember(eventForwardingMode = ForwardMatchingInstances.class)
@JsonIgnoreProperties("id")
private List<C> transactions = new ArrayList<>();
}
@Entity
@Table(name = "B")
@DynamicUpdate
@Getter
@Setter
@NoArgsConstructor
@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false)
@Log4j2
Class B implements Serializable {
@Id
@EntityId
@Column(name = "id", nullable = false)
@AggregateIdentifier
private String id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumns({@JoinColumn(name = "id", referencedColumnName = "id")})
@JsonIgnoreProperties("transactions")
private A a;
@EventSourcingHandler
public void on(final Event2 e2) {
//some updates to the model
}
}
Я использую агрегат хранилища состояний, но постоянно получаю сообщение об ошибке во время Spring Test со встроенным H2. Та же проблема не возникает с базой данных PGSQL в невстроенном режиме, но мы не можем запустить ее в конвейере.
Ошибка: java.lang.IllegalStateException: совокупный идентификатор не был установлен. Он должен быть установлен не позднее, чем при применении события создания
Я прошел через AnnotatedAggregate
protected <P> EventMessage<P> createMessage(P payload, MetaData metaData) {
if (lastKnownSequence != null) {
String type = inspector.declaredType(rootType())
.orElse(rootType().getSimpleName());
long seq = lastKnownSequence + 1;
String id = identifierAsString();
if (id == null) {
Assert.state(seq == 0,
() -> "The aggregate identifier has not been set. It must be set at the latest when applying the creation event");
return new LazyIdentifierDomainEventMessage<>(type, seq, payload, metaData);
}
return new GenericDomainEventMessage<>(type, identifierAsString(), seq, payload, metaData);
}
return new GenericEventMessage<>(payload, metaData);
}
Последовательность для этого устанавливается равной 2 и, следовательно, генерирует исключение вместо ленивой инициализации агрегата.
Что исправить? Мне не хватает какой-то конфигурации или мне нужно исправить код Axon?