Eclipse 用于测试和生产的JPA资源

Eclipse 用于测试和生产的JPA资源,eclipse,maven,jpa,Eclipse,Maven,Jpa,我有两个基于maven项目的典型持久性文件 src/main/resources/persistence.xml(JNDI) src/test/resources/persistence.xml(本地资源) eclipse和maven都无法在测试运行时向junit提供该功能,因为我的测试失败。作为最后手段,请尝试使用以下命令强制复制: ... maven资源插件 3.0.2 复制资源 验证 复制资源 ${project.build.directory} src/***.xml/direct

我有两个基于maven项目的典型持久性文件

  • src/main/resources/persistence.xml(JNDI)
  • src/test/resources/persistence.xml(本地资源)

eclipse和maven都无法在测试运行时向junit提供该功能,因为我的测试失败。

作为最后手段,请尝试使用以下命令强制复制:


...
maven资源插件
3.0.2
复制资源
验证
复制资源
${project.build.directory}
src/***.xml/directory>
真的
...
...

未测试。

作为最后手段,请尝试使用以下命令强制复制:


...
maven资源插件
3.0.2
复制资源
验证
复制资源
${project.build.directory}
src/***.xml/directory>
真的
...
...

未测试。

正如我在评论中解释的,我相信问题出在maven插件上。如果可能的话,尝试使用
maven-surefire-plugin
而不是
maven-failsafe-plugin
。但是,即使您让它使用第二个
persistence.xml
,在维护时也会遇到不同的问题(至少在Hibernate 5.2中是这样)。它不会从主要源中检测带注释的类,而只从测试中检测,您必须用
标记列出它们,并且每次都不要忘记这样做。我发现对我有效的解决方案是只使用主xml并实例化我的
EntityManagerFactory
,如下所示:

@BeforeClass
public static void initJpa() throws Exception {
    TreeMap<String, Object> props = new TreeMap<>();
    props.put("javax.persistence.jdbc.driver", "org.postgresql.Driver");
    props.put("javax.persistence.jdbc.url", "jdbc:postgresql://127.0.0.1:5432/projectdb");
    props.put("javax.persistence.jdbc.user", "testuser");
    props.put("javax.persistence.jdbc.password", "testpass");
    props.put("javax.persistence.nonJtaDataSource", null); // important to override the data-source!
    emf = Persistence.createEntityManagerFactory("persistance.unit.name", props);
}
@BeforeClass
public static void initJpa()引发异常{
TreeMap props=新的TreeMap();
put(“javax.persistence.jdbc.driver”、“org.postgresql.driver”);
put(“javax.persistence.jdbc.url”,“jdbc:postgresql://127.0.0.1:5432/projectdb");
put(“javax.persistence.jdbc.user”、“testuser”);
put(“javax.persistence.jdbc.password”、“testpass”);
put(“javax.persistence.nonJtaDataSource”,null);//覆盖数据源很重要!
emf=Persistence.createEntityManagerFactory(“Persistence.unit.name”,props);
}
javax.persistence.nonJtaDataSource
属性是最后的诀窍


这应该绕过您遇到的类加载覆盖问题。

正如我在评论中解释的,我相信问题出在maven插件中。如果可能的话,尝试使用
maven-surefire-plugin
而不是
maven-failsafe-plugin
。但是,即使您让它使用第二个
persistence.xml
,在维护时也会遇到不同的问题(至少在Hibernate 5.2中是这样)。它不会从主要源中检测带注释的类,而只从测试中检测,您必须用
标记列出它们,并且每次都不要忘记这样做。我发现对我有效的解决方案是只使用主xml并实例化我的
EntityManagerFactory
,如下所示:

@BeforeClass
public static void initJpa() throws Exception {
    TreeMap<String, Object> props = new TreeMap<>();
    props.put("javax.persistence.jdbc.driver", "org.postgresql.Driver");
    props.put("javax.persistence.jdbc.url", "jdbc:postgresql://127.0.0.1:5432/projectdb");
    props.put("javax.persistence.jdbc.user", "testuser");
    props.put("javax.persistence.jdbc.password", "testpass");
    props.put("javax.persistence.nonJtaDataSource", null); // important to override the data-source!
    emf = Persistence.createEntityManagerFactory("persistance.unit.name", props);
}
@BeforeClass
public static void initJpa()引发异常{
TreeMap props=新的TreeMap();
put(“javax.persistence.jdbc.driver”、“org.postgresql.driver”);
put(“javax.persistence.jdbc.url”,“jdbc:postgresql://127.0.0.1:5432/projectdb");
put(“javax.persistence.jdbc.user”、“testuser”);
put(“javax.persistence.jdbc.password”、“testpass”);
put(“javax.persistence.nonJtaDataSource”,null);//覆盖数据源很重要!
emf=Persistence.createEntityManagerFactory(“Persistence.unit.name”,props);
}
javax.persistence.nonJtaDataSource
属性是最后的诀窍


这应该绕过您遇到的类加载覆盖问题。

它应该在META-INF下,而不是在根目录下。失败的可能不是Eclipse。其他人报告说,使用maven failsafe插件启动的测试不会将
目标/测试类
放在
目标/类
前面的类路径中,因为它应该覆盖
META-INF/persistence.xml
(顺便说一句,它应该在META-INF中,而不是根目录中)。我使用maven surefire插件运行测试,并加载了正确的
persistence.xml
。如何加载persistence.xml文件?通过类路径?它应该在META-INF下,而不是根目录下。失败的可能不是Eclipse。其他人报告说,使用maven failsafe插件启动的测试不会将
目标/测试类
放在
目标/类
前面的类路径中,因为它应该覆盖
META-INF/persistence.xml
(顺便说一句,它应该在META-INF中,而不是根目录中)。我使用maven surefire插件运行测试,并加载了正确的
persistence.xml
。如何加载persistence.xml文件?通过类路径?