2015-09-27 28 views
0

更新:Spring框架运行junit4时不是公认的实体或标识符

更新了我的Infrastructure.xml中用于添加packagesToScan属性的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" /> 
    <property name="packagesToScan"> 
     <array> 
      <value>app.repository.entity</value> 
     </array> 
    </property> 
</bean> 

更新:在我Infrastructure.xml

的entityManagerFactory豆设置。

<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> 

和JPA库在我SpringApplication-context.xml的

<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的弹簧项目,它作为一个战争和部署包装时工作正常。但是,当我试图使用junit进行单元测试时,会抛出IllegalStateException异常。

18:44:57.333 [main] ERROR org.springframework.test.context.TestContextManager - Caught exception while allowing TestExecutionListener [org.springframewor[email protected]1a531422] to prepare test instance [[email protected]] 
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"}) 

我目前使用的弹簧,OpenJPA的和弹簧数据版本情况如下

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

我不明白为什么实体名称是不是一个公认的实体?

任何帮助表示赞赏。

回答

0

您是否正在使用扫描实体与LocalEntityManagerFactoryBean作为entityManagerFactory?它只扫描开始类路径(对于ex/src/java/test)。

然后切换到本地Container EntityManagerFactoryBean。

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

嗨Vovka,谢谢你的回答。我已经检查了entityManagerFactory bean是使用LocalContainerEntityManagerFactoryBean作为我的文章中更新的。但我不太确定我的存储库扫描设置是否正确? – Bruce

+0

尝试向entityManagerFactory添加 Vovka

+0

已尝试添加我的帖子中更新的packagesToScan属性。但仍然有同样的错误。谢谢 – Bruce