【问题标题】:Unknown Entity when calling EntityManager.persist()调用 EntityManager.persist() 时的未知实体
【发布时间】:2019-04-15 21:39:04
【问题描述】:

我在QuoteProjection.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
    }

我在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 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,它看起来可能导致它不扫描 Axon 包?

我在我的头上。任何帮助表示赞赏。

【问题讨论】:

  • 您熟悉纯Java JPA 的基础知识吗?你在使用 Kotlin JPA 插件吗?
  • @chrylis,我对各种形式的 JPA 都很陌生:Java 和 Kotlin。没有使用插件。
  • 检查您的persistence.xml,您的实体必须映射到数据源或所有实体必须通过配置自动映射
  • @Ioseb,我没有persistence.xml,因为我从一个没有的工作示例中复制。需要吗?
  • @JonathanM 是这个 spring 应用程序还是常规 java/hibernate 项目?

标签: java jpa kotlin axon


【解决方案1】:

@Entity注释你的类怎么样

参见例如https://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html#entity-mapping-entity

更新

检查扫描了哪些实体。 https://springbootdev.com/2017/11/13/what-are-the-uses-of-entityscan-and-enablejparepositories-annotations/amp/

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

更新 2

经过一番调查,事实证明这个问题是针对 Axon 的。

Axon 需要注册自己的实体,例如更新问题中提到的SagaEntry。 它在JpaAutoConfiguration 中注册这些实体 为此,它使用自己的注解@RegisterDefaultEntities 不幸的是,如果您依赖默认项目布局(包含您的应用程序的包的子包中的域模型),它们的配置效果很好, 但与@EntityScan 不合拍

检查问题https://github.com/AxonFramework/AxonFramework/issues/245

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

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

【讨论】:

  • 对此感到疑惑,但有一个没有@Entity 的工作示例(尽管它出现在其上方的结构中)。有什么文档可以指点我吗?
  • 它有 XML 映射吗?
  • 我没有创建任何内容,因为我的工作示例也没有。需要吗?
  • 不,一点也不。在将注解引入 Java 之前使用它。只是猜测为什么您的示例在没有注释的情况下工作。
  • 明白了。我会试试注释。
猜你喜欢
  • 1970-01-01
  • 2015-05-14
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多