JPA异常:没有名为MyJPAApplicationPU的EntityManager的持久性提供程序。

3

我是一个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)

非常感谢您的帮助。


1
你的代码中是否将出现异常所提到的 persistence.XML 文件放置在正确的位置?它的内容是否正确? - Miro A.
3个回答

5

要使用JPA,您需要 META-INF/persistence.xml 文件。我假设这是一个Web应用程序,因此此文件夹必须位于 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']。 这是什么原因?如何解决这个问题? - Muneeswaran Balasubramanian

5
好的,这个错误很好解释,你需要提供一个 META-INF/persistence.xml 文件来使用 JPA。这个文件用于定义 "持久性单元"。根据 JPA 1.0 规范:
6.2.1 persistence.xml 文件

一个 persistence.xml 文件定义了一个持久性单元。它可以用于指定包含在持久性单元中的托管持久化类、这些类的对象/关系映射信息以及持久性单元和实体管理器(s)和为持久性单元的实体管理器工厂的其他配置信息。 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>

以下是有关上述文件的一些注释:

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

0
 EntityManagerFactory emf = Persistence.createEntityManagerFactory("<JDBC connection>");

检查正确的JDBC连接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接