当前位置: 首页 > 知识库问答 >
问题:

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

皇甫聪
2023-03-14

我正在使用JPA开发一个JavaSE应用程序。不幸的是,调用后我得到了nullPersistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);

下面你会发现:

  • 调用EntityManagerFactory并意外返回null
  • 我的坚持。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:

<?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>

我的项目结构:

共有3个答案

施华奥
2023-03-14

所以在我的例子中,所有的东西都在类路径中,但我必须添加

c类=类。forName(“org.eclipse.persistence.jpa.PersistenceProvider”);

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

从景曜
2023-03-14

快速建议:

  • 检查是否存在持久性。xml在类路径中

在独立应用程序(JavaEE之外)中使用JPA时,需要在某个地方指定持久性提供程序。据我所知,这可以通过两种方式完成:

  • 将provider元素添加到持久化单元:

在我的例子中,我发现由于maven的错误配置,hibernate entitymanager。jar不作为依赖项包含,即使它是其他模块的暂时依赖项。

请参见此处的答案:没有名为EntityManager的持久性提供程序

司徒云
2023-03-14

你必须移动持久性。将xml文件保存到适当的位置。

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

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

以下是细节:(摘自JPA规范)

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

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

如果你是非Java EE应用程序

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

如果您在JavaEE应用程序中,则以下内容有效

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

  • 一个EJB-JAR文件
  • WAR文件的WEB-INF/class目录[80]
  • WAR文件的WEB-INF/lib目录中的jar文件
  • EAR库目录中的jar文件
  • 应用程序客户端jar文件
 类似资料:
  • 我的动态 Web 应用程序有问题。我刚刚开始学习JavaEE 6,现在我在JPA上堆叠。我配置了我的应用程序,添加了库,但我仍然得到这个令人讨厌的信息:没有名为X的EntityManager的持久性提供程序。我试图在互联网上得到答案,但没有什么帮助我。 这是我的persistance.xml文件: 这是我的班级Uzytkownik.java: 以及servlet中我的EntityManagerFa

  • 问题内容: 我在目录下使用相同的名字。然后,我用以下代码调用它: 但是,我收到以下错误消息: 这是: 它应该在类路径中。但是,我得到了上面的错误。 问题答案: 在之后,定义持久性提供程序名称:

  • 我试图在Eclipse中测试我的hibernate maven应用程序,当我运行获取enttity类名称的方法时,我得到了以下异常: 这是persistence.xml: 这是使用以下方法的类: 波姆。xml: 我尝试更改持久性的版本号、更改xmlns、提供程序的名称,但仍然是例外。

  • 我在REST服务器上工作,同时学习EJB\Hibernate。当服务调用DAO时,我面临一个问题,即它找不到我的持久性单元。 在本例中,我得到“无法为unitName PersistenceUnit检索EntityManagerFactory” 然后我试试这个: null pom.xml

  • 我正在尝试调用persistence.xml来显示Netbean IDE中数据库中的一些数据。我已经查看并尝试了以前用户提出的不同方法,但我仍然无法解决这个问题。 我用这个来称呼持久性单元, 这是我试图运行文件时返回的结果, 这是第805行,错误似乎就是从这里产生的 如前所述, 我已经在持久化单元名称下添加了提供者, 我已经确保持久性是单元在META-INF文件夹中, 它在类路径中,所以我不确定错

  • 在drools workbench中,我创建了java类来获取entitymanager,并在drl文件中使用它,但我的问题是 当我在workbench中创建新项目时,我会像maven一样创建项目结构 当我打电话给全班的时候,像贝娄一样 persistence.xml像贝娄 还有pom。类xml 当我试图调用工厂类时,我没有为名为XXX的持久性提供程序 新工厂类