6

很长一段时间以来,我一直在寻找答案,然后才来到这里问这个问题。我的问题很简单:使用 JPA Entity Manager API 时无法运行任何 JUnit 测试。看来我的测试没有读取persistence.xml文件。

当我调用时new Configuration().configure().buildSessionFactory(),它就像一个魅力,但调用时抛出异常Persistence.createEntityManagerFactory("myapp")是:

javax.persistence.PersistenceException:在 com.myapp.Test01 的 javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47) 的 javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:69) 中没有名为 myapp 的 EntityManager 的持久性提供程序。 setUpBeforeClass(Test01.java:22)

我的 JavaSE 项目具有以下结构:

myapp
++src/main/java
   ++com.myapp.model
      ++// My entity classes are here
++src/test/java
   ++com.myapp
      ++Test01.java
++src/main/resources
  ++hibernate.cfg.xml
  ++META-INF 
    ++persistence.xml

看起来persistence.xml像:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    version="2.0">
    <persistence-unit name="myapp" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="hibernate.ejb.cfgfile" value="hibernate.cfg.xml"></property> 
        </properties>
    </persistence-unit>
</persistence>

你知道如何解决这个问题吗?

非常感谢您的帮助。

4

2 回答 2

9

将配置放入src/test/resources/META-INF.

于 2012-10-14T20:10:14.523 回答
7

我的猜测是那org.hibernate.ejb.HibernatePersistence不在你的类路径上。那不在主要的 Hibernate jar 中,它在 hibernate-entitymanager 或类似的 jar 中。

在调用之前的代码中可以做几个快速的实验Persistence.createEntityManagerFactory()

System.out.println(getClass().getResource("META-INF/persistence.xml"));

和:

System.out.println(Class.forName("org.hibernate.ejb.HibernatePersistence"));

检查 Eclipse 是否正在复制您的资源也是明智的;执行 Project > Clean,然后查看您的 Eclipse 构建输出目录以查看 persistence.xml 是否在您期望的位置。我有时会遇到 Eclipse 出于某种原因不复制资源的情况。

于 2012-10-14T20:11:42.283 回答