级联类型似乎不适用于 axon 使用的实体管理器。如果我使用 CascadeType.Persist,第二次尝试使用同一个子对象创建对象时,会出现重复键约束错误。如果我使用 CascadeType.Merge,如果数据库中不存在条目,它将无法工作。
尝试使用不同的 CascadeTypes,以及 hibernate @Cascade 注释,但没有效果。还尝试对子实体使用 @AggregateMember,但子实体似乎没有在父实体之前保存。
@Bean
Repository<OfficialRecordEntity> axonOfficialRecordRepository(EntityManagerProvider emp, ParameterResolverFactory parameterResolverFactory, EventBus eventBus) {
return GenericJpaRepository.builder(OfficialRecordEntity.class)
.parameterResolverFactory(parameterResolverFactory)
.entityManagerProvider(emp)
.eventBus(eventBus)
.build();
}
@Aggregate
@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = {"id"}, callSuper = false)
@Builder
public class OfficialRecordEntity {
@Id
@AggregateIdentifier
private String id;
//many other fields
@OneToMany(cascade = CascadeType.PERSIST)
private List<Accessory> accessories;
@ManyToOne(cascade = CascadeType.PERSIST)
private ExpeditionType expeditionType;
//many other commandhandlers/eventhandlers
@CommandHandler
public OfficialRecordEntity(CreateOfficialRecordCommand command) {
apply(new CreateOfficialRecordEvent(command.getId(), command.getOfficialRecordDTO()));
}
@EventSourcingHandler
public void on(final CreateOfficialRecordEvent event) {
//...some field initializations
}
}
Accessory 和 ExpeditionType 也是实体。
我知道我们没有充分使用 axon 框架,但此时我只是试图正确保存OfficialRecordEntity之前的所有子实体 - 期望级联类型应该足够,但由于对于 axon 的实体管理器提供商来说,它似乎不是这样工作的。
最佳答案
首先,我想指出的是,我主要习惯使用事件源方法来存储和检索聚合。 尽管如此,我也构建了一个状态存储方法,其中确实包含一个聚合根,其下有多个聚合成员,位于一个集合中。
以下版本有助于推断您是否具有与我类似的设置:
- Java - 8
- Axon 框架 - 4.1.1
- Spring Boot(和 Starter Data JPA)- 2.0.5.RELEASE
然后,我的聚合和实体看起来像这样:
// Aggregate sample
@Entity
@Aggregate
class SomeAggregateRoot {
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "entityId")
@AggregateMember
private List<SomeEntity> entities = new ArrayList<>();
// Some command and event handlers...
}
// Aggregate Member sample
@Entity
public class SomeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private String id;
@EntityId
private String entityId;
// Some command and event handlers...
}
此设置,无需亲自指定 SomeAggregateRoot
存储库,对我来说可以正常工作。因此,我让 axon-spring-boot-starter 依赖项自动配置所有必要的 Axon 组件。
我知道这不是对您问题的直接回答。 然而,我不确定你的设置问题出在哪里,所以我希望将你的设置与我刚刚分享的内容交叉引用会给你一个“哈哈!”时刻。
更新
为了使用可共享的 Github 存储库对此进行测试,我设置了一个在工作状态下显示上述内容的存储库,您可以找到 here .
关于java - 在 Axon 聚合中保留 ManyToOne/OneToOne 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57463106/