【问题标题】:JPA Exception: No Persistence provider for EntityManager named MyJPAApplicationPUJPA 异常:没有名为 MyJPAApplicationPU 的 EntityManager 的持久性提供程序
【发布时间】:2011-03-14 07:06:17
【问题描述】:

我是 JPA 的新手。我正在尝试使用 JPA 运行一些示例代码,但出现以下异常:

javax.persistence.PersistenceException: No Persistence provider for EntityManager named MyJPAApplicationPU

我把我的异常信息放在这里,

INFO: Could not find any META-INF/persistence.xml file in the classpath
javax.persistence.PersistenceException: No Persistence provider for EntityManager named MyJPAApplicationPU
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:33)
        at com.myJpa.TestJPA.setUp(TestJPA.java:30)
        at com.myJpa.TestJPA.main(TestJPA.java:72)

任何帮助将不胜感激。

【问题讨论】:

  • 您是否将异常中提到的persistence.XML 文件放在适当的位置?内容正确吗?

标签: java orm jpa persistence


【解决方案1】:
 EntityManagerFactory emf = Persistence.createEntityManagerFactory("<JDBC connection>");

检查正确的 JDBC 连接。

【讨论】:

    【解决方案2】:

    嗯,错误是自我解释的,您需要提供META-INF/persistence.xml 才能使用 JPA。该文件用于定义“持久性单元”。来自 JPA 1.0 规范:

    6.2.1 persistence.xml文件

    persistence.xml 文件定义了一个 持久性单元。它可用于 指定托管持久性类 包含在持久性单元中, 对象/关系映射信息 对于这些课程和其他 的配置信息 持久性单元和实体 经理和实体经理工厂 对于持久性单元。这 persistence.xml 文件位于 META-INF 根目录 的持久性单元。这 信息可以定义为 遏制或引用,如 如下所述。

    这是一个用于 Java SE 环境的示例 persistence.xml(使用 Hibernate 作为 JPA 提供程序):

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence xmlns="http://java.sun.com/xml/ns/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_1_0.xsd"
      version="1.0">
        <persistence-unit name="MyJPAApplicationPU" transaction-type="RESOURCE_LOCAL">
            <provider>org.hibernate.ejb.HibernatePersistence</provider>
            <class>com.mycompany.Foo</class>
            <class>com.mycompany.Bar</class>
            <exclude-unlisted-classes>true</exclude-unlisted-classes>
            <properties>
                <property name="hibernate.connection.provider_class" value="org.hibernate.connection.DriverManagerConnectionProvider" />
                <property name="hibernate.connection.url" value="jdbc:hsqldb:mem:unit-testing-jpa"/>
                <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
                <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
                <property name="hibernate.connection.username" value="sa"/>
                <property name="hibernate.connection.password" value=""/>
                <property name="hibernate.show_sql" value="true"/>
            </properties>
        </persistence-unit>
    </persistence>
    

    关于上述文件的一些cmets:

    • 在 Java SE 环境中运行时,不能依赖 JTA,事务类型必须为 RESOURCE_LOCAL(这实际上是 Java SE 环境中的默认值,但指定它会更清楚)。
    • 在 Java SE 环境中运行时,不能使用 JDNI 数据源,提供者将直接从 JDBC 驱动程序获取连接,因此您必须将相关信息传递给提供者(驱动程序类名、连接 url、用户、密码)。在 JPA 1.0 中,用于传递这些元数据的属性是特定于提供者的。
    • 为确保 Java SE 应用程序的可移植性,有必要明确列出包含在持久性单元中的托管持久性类。

    【讨论】:

      【解决方案3】:

      要让 JPA 工作,您需要 META-INF/persistence.xml。我假设这是一个网络应用程序,所以这个文件夹必须在WEB-INF/classes/

      persistence.xml 文件如下所示:

      <persistence xmlns="http://java.sun.com/xml/ns/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_1_0.xsd"
              version="1.0">
      
        <persistence-unit name="MyJPAApplicationPU" transaction-type="RESOURCE_LOCAL">
      
        </persistence-unit>
      
      </persistence>
      

      【讨论】:

      • 大家好,感谢您的努力和解决方案。但是现在我解决了上述问题并得到了新问题,即实体没有字段[firstname='m']。这是什么原因?我该如何解决这个问题?
      猜你喜欢
      • 2014-12-07
      • 2022-07-05
      • 2020-02-06
      • 1970-01-01
      • 2016-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-15
      相关资源
      最近更新 更多