Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 没有名为X的EntityManager的持久性提供程序_Java_Jakarta Ee_Jpa_Entitymanager_Persistence.xml - Fatal编程技术网

Java 没有名为X的EntityManager的持久性提供程序

Java 没有名为X的EntityManager的持久性提供程序,java,jakarta-ee,jpa,entitymanager,persistence.xml,Java,Jakarta Ee,Jpa,Entitymanager,Persistence.xml,我正在使用JPA开发一个JavaSE应用程序。不幸的是,我在调用后得到null: Persistence.createEntityManagerFactory(Persistence\u UNIT\u NAME) 您将在下面找到: 调用EntityManagerFactory并意外返回null 我的persistence.xml文件 我的项目结构 我的代码片段: public class Main { private static final String PERSISTENCE_U

我正在使用JPA开发一个JavaSE应用程序。不幸的是,我在调用后得到
null
Persistence.createEntityManagerFactory(Persistence\u UNIT\u NAME)

您将在下面找到:

  • 调用
    EntityManagerFactory
    并意外返回
    null
  • 我的
    persistence.xml
    文件
  • 我的项目结构
我的代码片段:

public class Main {
    private static final String PERSISTENCE_UNIT_NAME = "MeineJpaPU";
    private static EntityManagerFactory factory;

    public static void main(String[] args) {
        // I get null on this line!!!
       factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);

       EntityManager em = factory.createEntityManager();
       // do stuff with entity manager
       ...
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
    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">
  <persistence-unit name="MeineJpaPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
    <class>path.to.package.server.Todo</class>
      <exclude-unlisted-classes>false</exclude-unlisted-classes>
     <properties>       
            <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>       
            <property name="javax.persistence.jdbc.url"  value="jdbc:postgresql://localhost:5432/test"/>       
            <property name="javax.persistence.jdbc.user" value="postgres"/>       
            <property name="javax.persistence.jdbc.password" value="postgres"/>       
        </properties>
  </persistence-unit>
</persistence>
My persistence.xml:

public class Main {
    private static final String PERSISTENCE_UNIT_NAME = "MeineJpaPU";
    private static EntityManagerFactory factory;

    public static void main(String[] args) {
        // I get null on this line!!!
       factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);

       EntityManager em = factory.createEntityManager();
       // do stuff with entity manager
       ...
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
    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">
  <persistence-unit name="MeineJpaPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
    <class>path.to.package.server.Todo</class>
      <exclude-unlisted-classes>false</exclude-unlisted-classes>
     <properties>       
            <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>       
            <property name="javax.persistence.jdbc.url"  value="jdbc:postgresql://localhost:5432/test"/>       
            <property name="javax.persistence.jdbc.user" value="postgres"/>       
            <property name="javax.persistence.jdbc.password" value="postgres"/>       
        </properties>
  </persistence-unit>
</persistence>

org.apache.openjpa.persistence.PersistenceProviderImpl
path.to.package.server.Todo
假的
我的项目结构:

public class Main {
    private static final String PERSISTENCE_UNIT_NAME = "MeineJpaPU";
    private static EntityManagerFactory factory;

    public static void main(String[] args) {
        // I get null on this line!!!
       factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);

       EntityManager em = factory.createEntityManager();
       // do stuff with entity manager
       ...
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
    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">
  <persistence-unit name="MeineJpaPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
    <class>path.to.package.server.Todo</class>
      <exclude-unlisted-classes>false</exclude-unlisted-classes>
     <properties>       
            <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>       
            <property name="javax.persistence.jdbc.url"  value="jdbc:postgresql://localhost:5432/test"/>       
            <property name="javax.persistence.jdbc.user" value="postgres"/>       
            <property name="javax.persistence.jdbc.password" value="postgres"/>       
        </properties>
  </persistence-unit>
</persistence>

必须将
persistence.xml
文件移动到适当的位置

更具体地说,将
META-INF/persistence.xml
文件添加到源文件夹的根目录中

在本例中,以下是适当的位置:
src\main\java\META-INF\persistence.xml

详情如下: (摘自JPA规范)

persistence.xml文件定义了一个持久性单元。persistence.xml文件 文件位于文件根目录的META-INF目录中 持久性单位

持久化单元的根是这里的键

如果您是非Java EE应用程序

META-INF目录中包含 persistence.xml文件称为持久性单元的根

如果您使用的是Java EE应用程序,则以下内容有效

在JavaEE环境中,持久化单元的根必须是 以下是:

  • EJB-JAR文件
  • WAR文件的WEB-INF/classes目录[80]
  • WAR文件的WEB-INF/lib目录中的jar文件
  • EAR库目录中的jar文件
  • 应用程序客户机jar文件
快速建议:

  • 检查persistence.xml是否在类路径中
  • 检查hibernate提供程序是否在类路径中
在独立应用程序(JavaEE之外)中使用JPA时,需要在某个地方指定持久性提供程序。据我所知,这可以通过两种方式实现:

  • 将provider元素添加到持久化单元:
    org.hibernate.ejb.HibernatePersistence
    (如Chris在此处的正确答案中所述:)
  • 必须将接口javax.persistence.spi.PersistenceProvider指定为服务,请参见此处:(在类路径中包含hibernate或其他JPA实现时,通常会包含此选项
在我的例子中,我发现由于maven的错误配置,hibernate entitymanager.jar没有作为依赖项包含,即使它是其他模块的暂时依赖项


请参见此处的答案:

因此,在我的例子中,所有内容都在类路径中,但我必须添加

Class c=Class.forName(“org.eclipse.persistence.jpa.PersistenceProvider”)


我认为这导致PersistenceProvider在javax类中注册了自己。我过去也曾为JDBC驱动程序做过类似的事情。

如果您不想移动META-INF文件夹(可能是因为您的IDE在那里创建了它,您不想混淆它),如果您使用的是Maven,则可以使用
标记告诉Maven在何处查找META-INF。请参阅:

就你而言:

<build>
  <resources>
    <resource>
      <directory>src</directory>
    </resource>
  </resources>
</build>

src

我最近将NB 8.1升级到了8.2,突然遇到了这个问题,花了2天时间绞尽脑汁解决了这个问题。到了8.1,删除processorpath(其他人提到过)起到了作用。有了8.2,问题依然存在


最后,我发现eclipselink的默认库(JPA 2.1)中缺少eclipselink.jar。我将该文件添加到库的定义中,瞧,它开始工作了!

不要明确给出JPA依赖关系

        <dependency>
                    <groupId>javax.persistence</groupId>
                    <artifactId>persistence-api</artifactId>
                    <version>1.0.2</version>    
      </dependency>

javax.persistence
持久性api
1.0.2    
谢谢,

Rahul

hibernate-entitymanager.jar对我来说也是正确的答案。实际上,你让我从长达一周的长篇大论中解脱出来,我一直在努力弄清楚这个xml的东西