繁体   English   中英

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

[英]JPA Exception: No Persistence provider for EntityManager named MyJPAApplicationPU

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

任何帮助,将不胜感激。

要使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>

好吧,错误是自我解释,你需要提供一个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>

关于上述文件的一些评论:

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

检查正确的JDBC连接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM