【问题标题】:PersistenceUnitLoadingException - Error creating EntityManagerFactoryPersistenceUnitLoadingException - 创建 EntityManagerFactory 时出错
【发布时间】:2015-05-09 19:02:27
【问题描述】:

我最近几天都在寻找错误,但我找不到它。我不得不说我是 JPA 的新手,这是我的第一个项目,我是按照教程创建的,但是有一个无法解释的错误。

我使用 Eclipse 和 Eclipselink 并连接了一个运行良好的 mySql 数据库

我的代码:

package com.tutorialspoint.eclipselink.service;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import com.tutorialspoint.eclipselink.entity.Employee;

public class CreateEmployee {

    public static void main(String []args){
        EntityManagerFactory emfactory = Persistence.createEntityManagerFactory("tutorialspoint_JPA_Eclipselink");
        EntityManager entitymanager = emfactory.createEntityManager();
        entitymanager.getTransaction().begin();

        Employee e = new Employee();
        e.setId(1201);
        e.setName("Gopal");
        e.setSalary(40000);
        e.setDegree("Technical Manager");
        entitymanager.persist(e);
        entitymanager.getTransaction().commit();
        entitymanager.close();
        emfactory.close();
    }

}

persistence.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" x   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence     http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="tutorialspoint_JPA_Eclipselink" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
        <class>com.tutorialspoint.eclipselink.entity.Employee</class>
        <properties>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/demo"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="removed"/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
        </properties>
    </persistence-unit>
</persistence>

还有错误:

Exception in thread "main" Local Exception Stack: 
Exception [EclipseLink-30005] (Eclipse Persistence Services -     2.6.0.v20150309-bf26070):         org.eclipse.persistence.exceptions.PersistenceUnitLoadingException
Exception Description: An exception was thrown while searching for     persistence archives with ClassLoader: sun.misc.Launcher$AppClassLoader@1b1f1f12
Internal Exception: javax.persistence.PersistenceException: Exception         [EclipseLink-28018] (Eclipse Persistence Services - 2.6.0.v20150309-bf26070):     org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Predeployment of PersistenceUnit [tutorialspoint_JPA_Eclipselink] failed.
Internal Exception: java.lang.NullPointerException
    at     org.eclipse.persistence.exceptions.PersistenceUnitLoadingException.exceptionSear    chingForPersistenceResources(PersistenceUnitLoadingException.java:127)
    at     org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactoryImpl(P    ersistenceProvider.java:111)
    at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(Persi    stenceProvider.java:183)
    at     javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)
    at     javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
    at     com.tutorialspoint.eclipselink.service.CreateEmployee.main(CreateEmployee.java:1    1)
Caused by: javax.persistence.PersistenceException: Exception [EclipseLink-    28018]         (Eclipse Persistence Services - 2.6.0.v20150309-bf26070):     org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Predeployment of PersistenceUnit     [tutorialspoint_JPA_Eclipselink] failed.
Internal Exception: java.lang.NullPointerException
    at     org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.createPredeployFaile    dPersistenceException(EntityManagerSetupImpl.java:2023)
    at         org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityMana    gerSetupImpl.java:2014)
    at     org.eclipse.persistence.internal.jpa.deployment.JPAInitializer.callPredeploy(JPA    Initializer.java:100)
    at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactoryImpl(P    ersistenceProvider.java:100)
    ... 4 more
Caused by: Exception [EclipseLink-28018] (Eclipse Persistence Services -     2.6.0.v20150309-bf26070):     org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Predeployment of PersistenceUnit     [tutorialspoint_JPA_Eclipselink] failed.
Internal Exception: java.lang.NullPointerException
    at     org.eclipse.persistence.exceptions.EntityManagerSetupException.predeployFailed(E    ntityManagerSetupException.java:231)
    ... 8 more
Caused by: java.lang.NullPointerException
    at     org.eclipse.persistence.platform.server.NoServerPlatformDetector.checkPlatform(N    oServerPlatformDetector.java:28)
    at     org.eclipse.persistence.platform.server.ServerPlatformUtils.detectServerPlatform    (ServerPlatformUtils.java:44)
    at     org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.updateServerPlatform    (EntityManagerSetupImpl.java:973)
    at     org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityMana    gerSetupImpl.java:1718)
    ... 6 more

【问题讨论】:

  • 你把persistence.xml放在哪里了?请写出文件路径。
  • persistence.xml 文件位于 META-INF 文件夹和 JPA-Content 下
  • 您的persistence.xml 位于此处很重要:'projectroot'/src/main/resources/META-INF/persistence.xml。在我看来,它似乎没有找到“tutorialspoint_JPA_Eclipselink”持久性文件......
  • 路径是:tutorialspoint_JPA_Eclipselink/src/META-INF 如何移动到你建议的路径?
  • 好的。请尝试将您的路径更改为:src/main/resources/META-INF/persistence.xml 并让我知道它是否有效

标签: java mysql jpa


【解决方案1】:

您可能放错了 EclipseLink jar 文件。

NPE (NullPointerException) 源自 org.eclipse.persistence.platform.server.NoServerPlatformDetector 中的第 28 行(请参阅您发布的错误中的最后一个 Caused by)。此行显示在 GrepCode here 上,并显示:
PrivilegedAccessHelper.getClassLoaderForClass(NoServerPlatformDetector.class).toString();
并查看PrivilegedAccessHelper.getClassLoaderForClass 方法表明该行可以重写为:
NoServerPlatformDetector.class.getClassLoader().toString();

现在,getClassLoader 可以返回 null,在这种情况下,toString() 将导致 NPE。如果 EclipseLink jar 文件是使用引导类加载器加载的,getClassLoader 将返回 null(有关引导类加载器,请参阅 this wiki-page)。这让我相信您将 EclipseLink jar 文件放在 &lt;JAVA_HOME&gt;/jre/lib 目录中,或者在 Eclipse 术语中,使其成为“JRE 系统库”的一部分。
右键单击 Eclipse 中的项目,选择“属性”,选择“Java 构建路径”,打开“库”选项卡,展开“JRE 系统库”(或类似内容)并确保未显示 EclipseLink jar 文件.使用“添加(外部)JAR”按钮添加 EclipseLink jar 文件(这应确保使用系统类加载器而不是引导类加载器加载 jar 文件)。

在侧节点上,导致 NPE 的 NoServerPlatformDetector 存在缺陷:下一行显示 if (loaderStr != null 但此检查是多余的,因为 toString() 永远不会返回 null。换句话说:程序员知道getClassLoader 可以返回null,但忘记了toString() 在这种情况下会导致NPE。

【讨论】:

  • 感谢您的回答,但 EclipseLink jar 文件已作为外部 jar 添加,并且从未成为 JRE 系统库的一部分
【解决方案2】:

这是正确的解决方案。如果将 eclipselink.jar 和/或 javax.persistence.jar 放在用户库中,则 eclipse 无法找到 EntityManagerFactory。所以你必须删除用户库并将jar文件放入JRE系统库中。

右键单击项目>构建路径>配置构建路径>Java构建路径(库)>添加外部Jar>在JRE系统库下添加eclipselink.jar,瞧...

【讨论】:

    猜你喜欢
    • 2020-02-08
    • 1970-01-01
    • 2013-06-15
    • 2020-07-12
    • 2021-12-19
    • 2018-02-18
    • 2015-06-19
    • 2017-01-03
    相关资源
    最近更新 更多