在轴突聚合中保持多对一/一对一关系



级联类型似乎不适用于轴突使用的实体管理器。如果我使用 CascadeType.Persist,则第二次尝试创建具有相同子对象的对象时,会出现重复键约束错误。如果我使用 CascadeType.Merge,如果数据库中不存在这些条目,它将不起作用。

尝试使用不同的级联类型,也是休眠@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    
}
}

附件和探险类型也是实体。

我知道我们没有充分利用轴突框架,但到目前为止,我只是想在 OfficialRecordEntity 之前正确保存所有子实体 - 期望级联类型应该足够了,但由于轴突的实体管理器提供程序,它似乎不是那样工作的。

首先,我要指出的是,我主要是习惯于使用事件源方法来存储和检索聚合。 尽管如此,我也构建了一种状态存储方法,该方法确实在一个集合中包含一个聚合根,其下有多个聚合成员。

以下版本有兴趣推断您是否具有与我类似的设置:

  • 爪哇 - 8
  • 轴突框架 - 4.1.1
  • Spring 引导(和启动器数据 JPA( - 2.0.5.发布

然后,我的聚合和实体看起来像这样:

// 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 存储库对此进行测试,我设置了一个在工作状态下显示上述内容的存储库,您可以在此处找到。

最新更新