【问题标题】:Not a recognized entity or identifier when running junit4 by Spring frameworkSpring框架运行junit4时不是可识别的实体或标识符
【发布时间】:2015-09-27 16:17:22
【问题描述】:

更新:

在我的 Infrastructure.xml 中更新了 entityManagerFactory bean,以添加 packagesToScan 属性。但仍然得到同样的错误。

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter" />
    </property>
    <property name="persistenceUnitName" value="PersistenceUnitAppDeploy" />
    <property name="packagesToScan">
        <array>
            <value>app.repository.entity</value>
        </array>
    </property>
</bean>

更新:

我的 Infrastructure.xml 中的entityManagerFactory bean 设置。

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter" />
    </property>
    <property name="persistenceUnitName" value="PersistenceUnitAppDeploy" />
</bean>

我的 SpringApplication-context.xml 中的 jpa 存储库设置

<tx:annotation-driven
    transaction-manager="transactionManager"
    proxy-target-class="true" />

<jpa:repositories
    base-package="devicemanage.repository.appdeploy.dao"
    repository-impl-postfix="Impl"
    entity-manager-factory-ref="entityManagerFactory"
    transaction-manager-ref="transactionManager">
</jpa:repositories>

我有一个带有 openjpa 的 spring 项目,它在打包为战争和部署时工作正常。但是,当我尝试使用 junit 进行单元测试时,会抛出 IllegalStateException。

18:44:57.333 [main] ERROR org.springframework.test.context.TestContextManager - Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@1a531422] to prepare test instance [TestSubtask@7a388990]
java.lang.IllegalStateException: Failed to load ApplicationContext
    at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:91) ~[spring-test-4.1.1.RELEASE.jar:4.1.1.RELEASE]
    at org.springframework.test.context.DefaultTestContext.getApplicationContext(DefaultTestContext.java:74) ~[spring-test-4.1.1.RELEASE.jar:4.1.1.RELEASE]
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:116) ~[spring-test-4.1.1.RELEASE.jar:4.1.1.RELEASE]
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:82) ~[spring-test-4.1.1.RELEASE.jar:4.1.1.RELEASE]
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:212) [spring-test-4.1.1.RELEASE.jar:4.1.1.RELEASE]
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:199) [spring-test-4.1.1.RELEASE.jar:4.1.1.RELEASE]
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:251) [spring-test-4.1.1.RELEASE.jar:4.1.1.RELEASE]
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) [junit-4.11.jar:?]
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:253) [spring-test-4.1.1.RELEASE.jar:4.1.1.RELEASE]
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:216) [spring-test-4.1.1.RELEASE.jar:4.1.1.RELEASE]
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:82) [spring-test-4.1.1.RELEASE.jar:4.1.1.RELEASE]
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) [junit-4.11.jar:?]
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) [junit-4.11.jar:?]
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) [junit-4.11.jar:?]
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) [junit-4.11.jar:?]
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) [junit-4.11.jar:?]
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:60) [spring-test-4.1.1.RELEASE.jar:4.1.1.RELEASE]
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:67) [spring-test-4.1.1.RELEASE.jar:4.1.1.RELEASE]
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309) [junit-4.11.jar:?]
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:162) [spring-test-4.1.1.RELEASE.jar:4.1.1.RELEASE]
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) [.cp/:?]
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) [.cp/:?]
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) [.cp/:?]
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) [.cp/:?]
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) [.cp/:?]
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) [.cp/:?]

主要原因是entity name is not a recognized entity or identifier

Caused by: org.apache.openjpa.persistence.ArgumentException: An error occurred while parsing the query filter "SELECT DISTINCT entity.serverMonitorAlertId FROM AlertLog AS entity WHERE (entity.creationTime>:startDate AND entity.creationTime<:endDate) ORDER BY entity.serverMonitorAlertId". Error message: The name "AlertLog" is not a recognized entity or identifier. Known entity names: []
at org.apache.openjpa.kernel.exps.AbstractExpressionBuilder.parseException(AbstractExpressionBuilder.java:119) ~[openjpa-2.2.2.jar:2.2.2]
at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getClassMetaData(JPQLExpressionBuilder.java:197) ~[openjpa-2.2.2.jar:2.2.2]
at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.resolveClassMetaData(JPQLExpressionBuilder.java:167) ~[openjpa-2.2.2.jar:2.2.2]
at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getCandidateMetaData(JPQLExpressionBuilder.java:242) ~[openjpa-2.2.2.jar:2.2.2]
at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getCandidateMetaData(JPQLExpressionBuilder.java:212) ~[openjpa-2.2.2.jar:2.2.2]
at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getCandidateType(JPQLExpressionBuilder.java:205) ~[openjpa-2.2.2.jar:2.2.2]
at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.access$200(JPQLExpressionBuilder.java:80) ~[openjpa-2.2.2.jar:2.2.2]
at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder$ParsedJPQL.populate(JPQLExpressionBuilder.java:2417) ~[openjpa-2.2.2.jar:2.2.2]
at org.apache.openjpa.kernel.jpql.JPQLParser.populate(JPQLParser.java:61) ~[openjpa-2.2.2.jar:2.2.2]
at org.apache.openjpa.kernel.ExpressionStoreQuery.populateFromCompilation(ExpressionStoreQuery.java:162) ~[openjpa-2.2.2.jar:2.2.2]
at org.apache.openjpa.datacache.QueryCacheStoreQuery.populateFromCompilation(QueryCacheStoreQuery.java:270) ~[openjpa-2.2.2.jar:2.2.2]
at org.apache.openjpa.kernel.QueryImpl.newCompilation(QueryImpl.java:673) ~[openjpa-2.2.2.jar:2.2.2]
at org.apache.openjpa.kernel.QueryImpl.compilationFromCache(QueryImpl.java:654) ~[openjpa-2.2.2.jar:2.2.2]
at org.apache.openjpa.kernel.QueryImpl.compileForCompilation(QueryImpl.java:620) ~[openjpa-2.2.2.jar:2.2.2]
at org.apache.openjpa.kernel.QueryImpl.compileForExecutor(QueryImpl.java:682) ~[openjpa-2.2.2.jar:2.2.2]
at org.apache.openjpa.kernel.QueryImpl.compile(QueryImpl.java:589) ~[openjpa-2.2.2.jar:2.2.2]
at org.apache.openjpa.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:997) ~[openjpa-2.2.2.jar:2.2.2]
at org.apache.openjpa.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:979) ~[openjpa-2.2.2.jar:2.2.2]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_45]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_45]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_45]
at java.lang.reflect.Method.invoke(Method.java:497) ~[?:1.8.0_45]
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:342) ~[spring-orm-4.1.1.RELEASE.jar:4.1.1.RELEASE]
at com.sun.proxy.$Proxy32.createQuery(Unknown Source) ~[?:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_45]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_45]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_45]
at java.lang.reflect.Method.invoke(Method.java:497) ~[?:1.8.0_45]
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:289) ~[spring-orm-4.1.1.RELEASE.jar:4.1.1.RELEASE]
at com.sun.proxy.$Proxy32.createQuery(Unknown Source) ~[?:?]

查询过滤器是我项目中所有实体中的第一个。并且 AlertLog 类已经注释到 @Entity。

我的junit类注释如下

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations =
{"file:src/main/resources/ConfigurationFile/Spring/SpringApplication-context.xml",
        "file:src/main/resources/ConfigurationFile/Spring/Infrastructure.xml",
        "file:src/main/resources/ConfigurationFile/Spring/Session.xml",
        "file:src/main/resources/ConfigurationFile/Spring/SystemConfiguration.xml",
        "file:src/main/resources/ConfigurationFile/Spring/Mail.xml"})

我目前使用的spring、openjpa和spring-data版本如下

    <springVersion>4.1.1.RELEASE</springVersion>
    <openjpaVersion>2.2.2</openjpaVersion>
    <springDataJpaVersion>1.3.0.RELEASE</springDataJpaVersion>

我不明白为什么实体名称不是可识别的实体?

感谢任何帮助。

【问题讨论】:

    标签: java spring junit spring-data-jpa openjpa


    【解决方案1】:

    您是否使用 LocalEntityManagerFactoryBean 作为 entityManagerFactory 来扫描实体?它只扫描起始类路径(例如 /src/java/test)。

    然后切换到LocalContainerEntityManagerFactoryBean。

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
            <property name="packagesToScan">
                <array>
                    <value>com.test2</value>
                </array>
            </property>
    </bean>
    

    【讨论】:

    • 您好 Vovka,感谢您的回答。我检查了 entityManagerFactory bean 使用 LocalContainerEntityManagerFactoryBean 作为我帖子中的更新。但我不太确定我的存储库扫描设置是否正确?
    • 尝试将 添加到 entityManagerFactory
    • 已尝试添加我的帖子中更新的 packagesToScan 属性。但仍然有同样的错误。谢谢
    • 您尝试过stackoverflow.com/questions/3914821/problem-with-using-jpa 的解决方案吗?也许之前记录的任何错误在哪里?
    猜你喜欢
    • 2011-04-24
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 2020-03-27
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    相关资源
    最近更新 更多