java - 在 Axon 聚合中保留 ManyToOne/OneToOne 关系

标签 java spring hibernate spring-boot axon

级联类型似乎不适用于 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/

相关文章:

spring - 如何在Spring Controller中定向到不同的JSP页面

spring - 通过带有 Terracotta 的 ehcache hibernate 二级缓存 - 根本不缓存?

java - 无法从底层数据库获取连接! -- HSQLDB

java - T 具有不同类型的 ArrayList<T>

java - 如何在java中的字符串列表中仅检索一组相似字符串中的一个

java - Spring Boot - 从 application.yml 访问值

java - 有效地将 Java 字符串转换为表示 C 字符串的以 null 结尾的 byte[]? (ASCII)

java - 帮助制定为期 2 周的 Spring 和 OSGi 学习计划

hibernate - EntityManager.find 找不到实体,但使用 Criteria API 可以

mysql - 如何处理 org.hibernate.exception.ConstraintViolationException,我使用 try catch 但它不起作用