Axon:启用JPA信息库时,未映射errorTokenEntry

问题描述

为了在具有Axon框架的Springboot应用程序中使用多个数据库。 我使用@EnableJpaRepositories之后开始出现以下错误

java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: TokenEntry is not mapped [SELECT te.segment FROM TokenEntry te WHERE te.processorName = :processorName ORDER BY te.segment ASC]
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:138)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188)
    at org.hibernate.internal.AbstractSharedSessionContract.createquery(AbstractSharedSessionContract.java:725)
    at org.hibernate.internal.AbstractSharedSessionContract.createquery(AbstractSharedSessionContract.java:816)
    at org.hibernate.internal.AbstractSessionImpl.createquery(AbstractSessionImpl.java:23)
    at sun.reflect.GeneratedMethodAccessor107.invoke(UnkNown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:366)
    at com.sun.proxy.$Proxy150.createquery(UnkNown Source)
    at sun.reflect.GeneratedMethodAccessor107.invoke(UnkNown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:314)
    at com.sun.proxy.$Proxy150.createquery(UnkNown Source)
    at org.axonframework.eventhandling.tokenstore.jpa.JpaTokenStore.fetchSegments(JpaTokenStore.java:194)
    at org.axonframework.eventhandling.TrackingEventProcessor$WorkerLauncher.run(TrackingEventProcessor.java:1195)
    at java.lang.Thread.run(Thread.java:748)
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: TokenEntry is not mapped [SELECT te.segment FROM TokenEntry te WHERE te.processorName = :processorName ORDER BY te.segment ASC]
    at org.hibernate.hql.internal.ast.QuerySyntaxException.generateQueryException(QuerySyntaxException.java:79)
    at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:103)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:220)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:144)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:113)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:73)
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:162)
    at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:604)
    at org.hibernate.internal.AbstractSharedSessionContract.createquery(AbstractSharedSessionContract.java:716)
    ... 15 common frames omitted
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: TokenEntry is not mapped
    at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClasspersister(SessionFactoryHelper.java:169)
    at org.hibernate.hql.internal.ast.tree.fromElementFactory.addfromElement(fromElementFactory.java:91)
    at org.hibernate.hql.internal.ast.tree.FromClause.addfromElement(FromClause.java:79)
    ... 21 common frames omitted

以下是我启用JPA存储库的方式

@Data
@Configuration
@EnableScheduling
@ConfigurationProperties(prefix = "spring.datasource")
@EnableJpaRepositories(
        basePackages = {"com.mypackage","org.axonframework.eventhandling.tokenstore.jpa"},entityManagerFactoryRef = "postgresEntityManager",transactionManagerRef = "postgresTransactionManager")}
)
public class PostgresConfiguration {

解决方法

有趣的是,我认为这确实是开箱即用的。 @tijo您是否正在使用Spring Boot?老实说,我假设没有,但是确实给了我一个建议。

当您使用@RegisterDefaultEntities时,Axon Framework使用axon-springboot-starter注释自动为您注册所需的实体。您可以在JpaAutoConfiguration类上看到它的完成。

正在执行的操作如下:

@RegisterDefaultEntities(packages = {
        "org.axonframework.eventhandling.tokenstore","org.axonframework.modelling.saga.repository.jpa"
})
public class JpaAutoConfiguration { ... }

您介意检查是否可行吗?我在配置中看到的主要区别是您只使用了"org.axonframework.eventhandling.tokenstorejpa"基本软件包。

让我们知道这是否可行!