如何通过eclipse在JUnit测试中使用persistence.xml和hibernate.cfg.xml?

fab*_*474 6 eclipse junit hibernate jpa jpa-2.0

在来这里之前我一直在寻找答案并提出这个问题.我的问题非常简单:在使用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
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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

非常感谢您的帮助.

s.f*_*ich 9

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


Tom*_*son 7

我的猜测org.hibernate.ejb.HibernatePersistence是不在你的类路径上.那不是主Hibernate jar,它在hibernate-entitymanager或者一些这样的jar中.

在调用之前的代码中,将进行几个快速实验Persistence.createEntityManagerFactory():

System.out.println(getClass().getResource("META-INF/persistence.xml"));
Run Code Online (Sandbox Code Playgroud)

和:

System.out.println(Class.forName("org.hibernate.ejb.HibernatePersistence"));
Run Code Online (Sandbox Code Playgroud)

检查Eclipse是否正在复制资源也是明智之举; 执行一个Project> Clean,然后查看Eclipse构建输出目录,看看persistence.xml是否符合您的预期.我有时会遇到Eclipse因某些原因而无法复制资源的情况.