我收到了这个错误:
线程“main”中的异常javax.persistence.PersistenceException:没有名为EmployeeDb的EntityManager的持久性提供程序 在javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:85) 在javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54) at staffManagement.test.TestHarness.main(TestHarness.java:14)
但是我无法理解为什么 - 我在家用电脑上做了同样的事情并且没有任何问题。这是我的测试文件的代码:
public class TestHarness {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("EmpDb");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Employee employee1 = new Employee("Brad", "Pitt", "Actor", 10000);
em.persist(employee1);
tx.commit();
em.close();
}
}
和我的persistence.xml文件:
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="EmpDb" transaction-type="RESOURCE_LOCAL">
<class>staffManagement.domain.Employee</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver" />
<property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/DbName" />
<property name="javax.persistence.jdbc.user" value="APP" />
<property name="javax.persistence.jdbc.password" value="APP" />
<property name="eclipselink.logging.level" value="FINE" />
<property name="eclipselink.ddl-generation" value="create-tables" />
<property name="eclipselink.ddl-generation.output-mode" value="database" />
</properties>
请帮帮我!我正在撕开我的头发。我正在使用Eclipse和Derby db。我在meta-inf文件夹中有persistence.xml文件。
答案 0 :(得分:0)
您需要使用persistence-unit
标记将所有内容包装在persistence.xml中。
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="EmpDb">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>staffManagement.domain.Employee</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver" />
<property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/DbName" />
<property name="eclipselink.target-database" value="Derby"/>
<property name="javax.persistence.jdbc.user" value="APP" />
<property name="javax.persistence.jdbc.password" value="APP" />
<property name="eclipselink.logging.level" value="FINE" />
<property name="eclipselink.ddl-generation" value="create-tables" />
<property name="eclipselink.ddl-generation.output-mode" value="database" />
</properties>
</persistence-unit>
另外,指定持久性提供程序和目标数据库:
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<property name="eclipselink.target-database" value="Derby"/>
答案 1 :(得分:0)
您需要将persistence.xml
文件移动到适当的位置。
在您的情况下,它应该是您的来源的兄弟姐妹。基本上,你的根包的兄弟,例如package
和echo
以下内容来自 JPA规范:
A persistence.xml file defines a persistence unit. The persistence.xml file is
located in the META-INF directory of the root of the persistence unit.
持久性单元的根是这里的关键。
如果您是非Java EE应用
The jar file or directory whose META-INF directory contains the persistence.xml
file is termed the root of the persistence unit.
如果您使用的是 Java EE应用,则以下内容有效
In Java EE environments, the root of a persistence unit must be one of the following:
• an EJB-JAR file
• the WEB-INF/classes directory of a WAR file[80]
• a jar file in the WEB-INF/lib directory of a WAR file
• a jar file in the EAR library directory
• an application client jar file
答案 2 :(得分:0)
奇怪的是,我甚至不必添加它。
持久性提供程序已自动完成。
我所做的就是将持久性单元标记上方的行移动然后重新编译并重新部署,然后将其移回并重新编译和重新部署,并且它有效。
不知道为什么会有效,但确实如此