Java 调用EntityManager.persist()时出现未知实体

Java 调用EntityManager.persist()时出现未知实体,java,jpa,kotlin,axon,Java,Jpa,Kotlin,Axon,我在quoteproject.java中有这个类: package com.mycompany.myapp.query; import com.mycompany.myapp.command.domain.ProjectedQuote; import javax.persistence.EntityManager; public class QuoteProjection { private final EntityManager entityManager; . . .

我在
quoteproject.java
中有这个类:

package com.mycompany.myapp.query;

import com.mycompany.myapp.command.domain.ProjectedQuote;
import javax.persistence.EntityManager;

public class QuoteProjection {

    private final EntityManager entityManager;
.
.
.
    public void on(CreateSubmissionEvt evt) {
        ProjectedQuote projectedQuote = new ProjectedQuote(evt.getAggregateId(), evt.getJobNumber());
        entityManager.persist(projectedQuote); // error reference this line
    }
package com.mycompany.myapp.query;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;

@SpringBootApplication
@EntityScan(basePackages = {"com.mycompany.myapp.command.domain"})
public class Application {
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}
我在
myApi.kt
中定义了
ProjectedQuote

package com.mycompany.myapp.command.domain

@Entity
@NamedQueries(
        NamedQuery(name = "ProjectedQuote.fetch",
                query = "SELECT q FROM ProjectedQuote q WHERE q.aggregateId LIKE CONCAT(:idStartsWith, '%') ORDER BY q.id"),
        NamedQuery(name = "ProjectedQuote.count",
                query = "SELECT COUNT(q) FROM ProjectedQuote q WHERE q.aggregateId LIKE CONCAT(:idStartsWith, '%')")
)
data class ProjectedQuote(@Id var aggregateId: String, var jobNumber : String) { constructor() : this("", "") }
运行时,出现以下错误:

java.lang.IllegalArgumentException: Unknown entity:
com.mycompany.myapp.command.domain.ProjectedQuote
        at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:787) ~hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]
        at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:768) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]
.
.
.
根据下面Lesiak的回答,我尝试将
@EntityScan
添加到应用程序
application.java

package com.mycompany.myapp.query;

import com.mycompany.myapp.command.domain.ProjectedQuote;
import javax.persistence.EntityManager;

public class QuoteProjection {

    private final EntityManager entityManager;
.
.
.
    public void on(CreateSubmissionEvt evt) {
        ProjectedQuote projectedQuote = new ProjectedQuote(evt.getAggregateId(), evt.getJobNumber());
        entityManager.persist(projectedQuote); // error reference this line
    }
package com.mycompany.myapp.query;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;

@SpringBootApplication
@EntityScan(basePackages = {"com.mycompany.myapp.command.domain"})
public class Application {
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}
…但现在出现以下错误,应用程序终止:

2019-04-16 15:34:54.265 ERROR 4212 --- [           main] o.s.boot.SpringApplication
          : Application run failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sagaStore' defined in class path resource [org/axonframework/springboot/autoconfig/JpaAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.axonframework.modelling.saga.repository.jpa.JpaSagaStore]: Factory method 'sagaStore' threw exception; nested exception is java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: SagaEntry is not mapped [SELECT new org.axonframework.modelling.saga.repository.jpa.SerializedSaga(se.serializedSaga, se.sagaType, se.revision) FROM SagaEntry se WHERE se.sagaId = :sagaId]
        at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:590) ~[spring-beans-5.0.9.RELEASE.jar!/:5.0.9.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1247) ~[spring-beans-5.0.9.RELEASE.jar!/:5.0.9.RELEASE]
.
.
.
错误消息中引用的Sagas是Axon框架的一部分。因此,通过对我的包执行
@EntityScan
,它似乎导致它无法扫描轴突包,也许


我在我的头上。非常感谢您的帮助。

@Entity

例如,见

更新

检查扫描了哪些实体。

默认情况下,Spring Boot将启用实体扫描并查看
@SpringBootApplication
所在的包(及其子包)。如果您的配置在另一个包中有实体,请使用
@EntityScan

更新2

经过一些调查,结果表明这个问题是非常轴突特异性的

Axon需要注册自己的实体,如更新问题中提到的
SagaEntry
。 它将这些实体注册到 为此,它使用自己的注释
@RegisterDefaultEntities
不幸的是,如果您依赖默认的项目布局(包含应用程序的包的子包中的域模型),那么它们的配置工作得很好, 但是对
@EntityScan

支票问题

我的建议是重新打包您的应用程序(如果是您的应用程序包,请将实体移动到子包中),然后删除
@EntityScan


如果您喜欢冒险,您可以尝试扫描由其自定义注释扫描的相同包,但我不确定这是否会成功。

您熟悉纯Java JPA的基础知识吗?你在使用Kotlin JPA插件吗?@chrylis,我对JPA的所有形式都很陌生:Java和Kotlin。没有使用插件。请检查您的
持久性.xml
,您的实体必须映射到数据源,或者所有实体都必须由config@Ioseb,我没有persistence.xml,因为我是从一个没有persistence.xml的工作示例复制的。它是必需的吗?@JonathanM是这个spring应用程序还是常规的java/hibernate项目?对此很好奇,但有一个工作示例没有@Entity(尽管它出现在它上面的结构上)。有没有可以指向我的文档?它有XML映射吗?我没有创建任何文档,因为我的工作示例也没有。需要吗?不,一点也不需要。它是在注释引入Java之前使用的。猜猜为什么你的例子没有注释就可以工作。明白了。我试试注释。