编辑:虽然给出并给出了一个(好的)答案,但这只涵盖了我的问题中一个相当不重要的部分。这个问题的主要部分仍然是开放的。
我在云项目中使用EclipseLink(2.6.2)。该项目是打包为WAR
文件并部署在Apache Tomcat 8上的Web应用程序。持久化上下文是使用Java代码设置的,其中我使用entityManagerFactoryBean.setPackagesToScan(packagesToScan)
指定要使用的实体。此配置通常按预期工作,其中确切地找到指定包中的实体类。
我现在无法理解何时使用哪个类加载器,尤其是在考虑Tomcat,运行测试和使用不同的连接池实现时。
在包含Tomcat连接池的Apache Tomcat上运行时,使用DataSource
插件(spring-cloud-connector
)创建spring-cloud-spring-service-connector
实例。
在这个设置中,一切都按预期工作,只要我不改变下面描述的类加载器(否则我面对实体类的ClassNotFoundException
)。
在JUnit
和spring-test
的帮助下运行单元测试时,使用内存数据库H2(使用来自{{1的DataSource
创建EmbeddedDatabaseBuilder
实例}})。在此设置中,我必须指定JPA以使用用于spring-jdbc
实例的类加载器(JPA属性映射中的键DataSource
),否则我得到“对象...不是已知的实体类型”
在嵌入式Apache Tomcat 8中运行测试时,我看不到任何指示正在使用的连接池的消息。在此设置中,我还必须将类加载器设置为单元测试。
如果我将eclipselink.classloader
(2.1.1)添加到我的项目并显式配置commons-dbcp
插件以使用它而不是Tomcat的连接池,我可以在Tomcat上运行应用程序而无需配置类加载器,但它也适用于上述的类加载器规范。
对于测试,spring-cloud-connector
与上面列出的方案相比没有任何改变(因为没有使用相应的配置)。
要点:
commons-dbcp
的JPA 您能否帮我理解这里的差异,并建议一个适合所有情况的简单解决方案?我假设DBCP和Spring使用与Tomcat(和Tomcat的连接池)不同的类加载器。
如果您需要更多信息,我很乐意添加它。
编辑:我添加了一个关于如何重现的大型自述文件的示例项目。
答案 0 :(得分:5)
“当我开始使用mvn tomcat7时,我得到另一个错误:运行,使用Tomcat的 连接池(CloudDatabaseConfig)并且不重新配置 classloder(JpaConfig):“
您必须在maven插件上配置PostreSQL依赖项。你发现ClassNot是因为PostgreSQL JAR不在路径中:
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/</path>
</configuration>
<!-- For any extra dependencies needed when running embedded Tomcat (not WAR dependencies) add them below -->
<dependencies>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.4-1206-jdbc41</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</plugin>
另请查看https://tomcat.apache.org/maven-plugin-2.2/run-mojo-features.html
我忘了在(JpaConfigWithDatasourceClassloader.getJPAProperties)中包含类加载器更改:
properties.put(CLASSLOADER, new java.net.URLClassLoader(
((java.net.URLClassLoader)classLoader).getURLs(), JpaConfigWithDatasourceClassloader.class.getClassLoader() )
) ;
使用此功能,您可以使用tomcat7:run