2015-05-09 2 views
2

Я провел последние дни в поисках ошибки, но я не смог ее найти. Я должен сказать, что я новичок в JPA, и это мой первый проект, который я создал после учебника, но имеющий необъяснимую ошибку.PersistenceUnitLoadingException - Ошибка при создании EntityManagerFactory

Я использую Eclipse, и EclipseLink и подсоединили runniny 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: [email protected] 
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 
+0

Где вы кладете настойчивость. XML? Пожалуйста, напишите путь к файлу. – Mihai

+0

Файл persistence.xml находится в META-INF-foulder и под JPA-контентом – OP13

+0

Важно, чтобы ваш persistence.xml был здесь: 'projectroot'/src/main/resources/META-INF/persistence.xml. Мне кажется, что он не находит файл persistence tutorialspoint_JPA_Eclipselink ... – Mihai

ответ

0

Возможно, вы, вероятно, потеряли jar-файл EclipseLink.

NPE (NullPointerException) вытекает из строки 28 в org.eclipse.persistence.platform.server.NoServerPlatformDetector (см. Последнюю Caused by в полученной вами ошибке). Эта линия показана на GrepCode here и показывает:
PrivilegedAccessHelper.getClassLoaderForClass(NoServerPlatformDetector.class).toString();
и глядя в метод PrivilegedAccessHelper.getClassLoaderForClass показывает, что линия может быть переписано как:
NoServerPlatformDetector.class.getClassLoader().toString();

Теперь getClassLoader может вернуться null в этом случае toString() будет вызывают NPE. getClassLoader возвращает null, если jar-файл EclipseLink был загружен с помощью загрузчика классов загрузки (см. this wiki-page о загрузчике классов bootstrap). Это заставляет меня поверить, что вы разместили jar-файл EclipseLink в каталоге <JAVA_HOME>/jre/lib или в терминах Eclipse, сделав его частью «JRE System Library».
Щелкните правой кнопкой мыши проект в Eclipse, выберите «Свойства», выберите «Путь сборки Java», откройте вкладку «Библиотеки», разверните «Системную библиотеку JRE» (или что-то подобное) и убедитесь, что jar-файл EclipseLink НЕ показан. Добавьте jar-файл EclipseLink с помощью кнопки «Добавить (внешние) JAR» (это должно обеспечить загрузку jar-файла с использованием системного загрузчика классов, а не загрузчика bootstrap).

На стороне узла, то NoServerPlatformDetector вызывает NPE несовершенна: следующая строка показывает if (loaderStr != null но эта проверка является излишней, так как toString() никогда не вернется null. Другими словами: программист знал, что getClassLoader может вернуть значение null, но забыл, что toString() вызовет NPE в этом случае.

+0

спасибо за ваш ответ, но jar-файл EclipseLink уже добавлен в качестве внешней банки и никогда не был частью системной библиотеки JRE – OP13

0

это правильное решение. Если вы поместите eclipselink.jar и/или javax.persistence.jar в пользовательскую библиотеку, тогда eclipse can not найдет EntityManagerFactory. Поэтому вам нужно удалить библиотеку пользователей и поместить файлы jar в библиотеку JRE.

Щелкните правой кнопкой мыши на проект> Build Path> Configure Build Path> Java Путь компоновки (библиотеки)> Добавить внешнюю Jar> добавить eclipselink.jar под JRE System Library и вуаля ...

Смежные вопросы