在来这里之前,我一直在寻找答案并提出这个问题。
我的问题非常简单:在使用JPA Entity Manager API时,我无法运行任何JUnit测试。我的测试似乎没有读取persistence.xml
文件。
当我拨打new Configuration().configure().buildSessionFactory()
时,它就像魅力一样,但在调用Persistence.createEntityManagerFactory("myapp")
时会抛出异常:
javax.persistence.PersistenceException:没有持久性提供程序 EntityManager名为myapp at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:69) 在 javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47) 在com.myapp.Test01.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>
你知道如何解决这个问题吗?
非常感谢你的帮助。
答案 0 :(得分:9)
将配置放在src/test/resources/META-INF
。
答案 1 :(得分: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是否正在复制资源也是明智之举;做一个项目&gt;清理然后查看Eclipse构建输出目录以查看persistence.xml是否在您期望的位置。我有时会遇到Eclipse因某些原因而无法复制资源的情况。