用于测试和生产的JPA资源

时间:2017-04-06 10:55:15

标签: eclipse maven jpa

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

  • src / main / resources / persistence.xml(JNDI)
  • src / test / resources / persistence.xml(LOCAL_RESOURCE)

eclipse和maven都无法在测试运行时将junit提供给我的测试失败。

2 个答案:

答案 0 :(得分:0)

作为最后的手段,请尝试使用maven-resources-plugin强制复制:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <version>3.0.2</version>
        <executions>
          <execution>
            <id>copy-resources</id>
            <!-- here the phase you need -->
            <phase>validate</phase>
            <goals>
              <goal>copy-resources</goal>
            </goals>
            <configuration>
              <outputDirectory>${project.build.directory}</outputDirectory>
              <resources>          
                <resource>
                  <directory>src/**/*.xml/directory>
                  <filtering>true</filtering>
                </resource>
              </resources>              
            </configuration>            
          </execution>
        </executions>
      </plugin>
    </plugins>
    ...
  </build>
  ...
</project>

未经测试。

答案 1 :(得分:0)

正如我在评论中解释的那样,我认为问题出在maven插件中。如果可能,请尝试使用maven-surefire-plugin代替maven-failsafe-plugin。但即使你让它与第二个persistence.xml一起使用,在维护时也会遇到另一个问题(至少在Hibernate 5.2中)。它不会从主要来源检测带注释的类,但只能从测试中检测到,您必须使用<class>标记列出它们,并且尽量不要忘记每次都这样做。我发现对我有用的解决方案是只有主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);
}

javax.persistence.nonJtaDataSource属性最终是诀窍。

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