【问题标题】:No Persistence provider for EntityManager named EmpDb没有名为 EmpDb 的 EntityManager 的持久性提供程序
【发布时间】:2014-03-03 01:03:23
【问题描述】:

我收到此错误:

线程“main”中的异常 javax.persistence.PersistenceException:没有名为 EmployeeDb 的 EntityManager 的持久性提供程序 在 javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:85) 在 javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54) 在 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 数据库。我在 meta-inf 文件夹中有 persistence.xml 文件。

【问题讨论】:

标签: jakarta-ee jpa eclipselink


【解决方案1】:

奇怪的是,我什至不必添加它。

持久性提供程序已自动完成。

我所做的解决方法是将持久性单元标记上方的行移动,然后重新编译和重新部署,然后将其移回并重新编译和重新部署,它就可以工作了。

不知道为什么它会起作用,但它确实起作用了

【讨论】:

    【解决方案2】:

    您需要将persistence.xml 文件移动到适当的位置。 在您的情况下,它应该是您的来源的兄弟姐妹。基本上,你的根包的兄弟,例如packageecho

    以下内容来自 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
    

    【讨论】:

      【解决方案3】:

      您需要使用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"/>            
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-08
        • 2016-04-18
        • 1970-01-01
        • 2019-12-04
        • 2016-08-02
        • 2012-05-02
        • 2013-10-19
        相关资源
        最近更新 更多