2016-01-22 134 views
0

我正在为学校练习创建一个小程序。我不知道我可以做任何错误的地方。有人能帮助我吗?获取java.lang.ExceptionInInitializerError

我运行测试时出现此错误。我在this.emf = TestUtil.getEMF();行发现错误。

/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package herkansing; 

import java.io.Serializable; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.NamedQueries; 
import javax.persistence.NamedQuery; 

@Entity 
@NamedQueries({ 
    @NamedQuery(name = "Account.getAll", query = "select a from Account as a"), 
    @NamedQuery(name = "Account.count", query = "select count(a) from Account as a"), 
    @NamedQuery(name = "Account.findByAccountNr", query = "select a from Account as a where a.accountNr = :accountNr") 
}) 
public class Player implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long Id; 
    private Long accountNr; 
    private String email; 
    private Long money; 
    private Long points; 

    public Player() { 
    } 

    public Player(Long accountNr){ 
     money = 0L; 
     points = 0L; 
     this.accountNr = accountNr; 
    } 

    //<editor-fold defaultstate="collapsed" desc="getters and setters ...."> 

    public Boolean add(Long amount) { 
     if (money + amount >= points) { 
      money += amount; 
      return true; 
     } else { 
      return false; 
     } 
    } 

    public Long getId() { 
     return Id; 
    } 

    public void setId(Long id) { 
     this.Id = id; 
    } 

    public Long getAccountNr() { 
     return accountNr; 
    } 

    public void setAccountNr(Long nr) { 
     this.accountNr = nr; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public Long getMoney() { 
     return money; 
    } 

    public void setMoney(Long money) { 
     this.money = money; 
    } 

    public Long getPoints() { 
     return points; 
    } 

    public void setPoints(Long points) { 
     this.points = points; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (obj == null) { 
      return false; 
     } 
     if (getClass() != obj.getClass()) { 
      return false; 
     } 
     final Player other = (Player) obj; 
     if (this.accountNr != other.accountNr && (this.accountNr == null || !this.accountNr.equals(other.accountNr))) { 
      return false; 
     } 
     if (this.money != other.money && (this.money == null || !this.money.equals(other.money))) { 
      return false; 
     } 
     if (this.points != other.points && (this.points == null || !this.points.equals(other.points))) { 
      return false; 
     } 
     return true; 
    } 
} 

Player类

<?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" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> 
    <persistence-unit name="playerPU" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
    <class>herkansing.Player</class> 
    <shared-cache-mode>NONE</shared-cache-mode> 
    <properties> 
     <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/?user=root"/> 
     <property name="javax.persistence.jdbc.user" value="root"/> 
     <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> 
     <property name="javax.persistence.jdbc.password" value="root"/> 
     <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/> 
     <!--adds logging--> 
     <property name="eclipselink.logging.logger" value="DefaultLogger"/> 
     <property name="eclipselink.logging.level" value="FINE"/> 
    </properties> 
    </persistence-unit> 
</persistence> 

的persistence.xml

/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package herkansing; 

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

/** 
* 
* @author Bart 
*/ 
public class TestUtil { 

    static final EntityManagerFactory emf = Persistence.createEntityManagerFactory("playerPU"); 

    /** 
    * 
    * @return the number of Accounts stored in the database 
    */ 
    static public int getNrOfAccountRecordsInDB() { 
     EntityManager em = getEMF().createEntityManager(); 
     return ((Number) em.createNamedQuery("Player.count").getSingleResult()).intValue(); 
    } 

    /** 
    * Search for an entity of the specified class and primary key. 
    * 
    * @param id 
    * @return the found Account instance or null if the entity does not exist 
    */ 
    static public Player getAccountById(Long id) { 
     EntityManager em = getEMF().createEntityManager(); 
     return em.find(Player.class, id); 
    } 

    static public EntityManagerFactory getEMF() { 
     return emf; 
    } 

} 

TestUtil类

/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package herkansingTest; 

import herkansing.TestUtil; 
import herkansing.DatabaseCleaner; 
import herkansing.Player; 
import java.sql.SQLException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import org.junit.After; 
import org.junit.AfterClass; 
import org.junit.Before; 
import org.junit.BeforeClass; 
import org.junit.Test; 
import static org.junit.Assert.*; 

/** 
* 
* @author Bart 
*/ 
public class PlayerTest { 

    final EntityManagerFactory emf; 
    EntityManager em, em1, em2; 
    private static final Logger LOG = Logger.getLogger(PlayerTest.class.getName()); 

    public PlayerTest() { 
     this.emf = TestUtil.getEMF(); 
    } 

    @Before 
    public void setUp() { 
     em = emf.createEntityManager(); 
     em1 = emf.createEntityManager(); 
     em2 = emf.createEntityManager(); 
     new DatabaseCleaner().resetDatabase(); 
    } 
} 

PlayerTest

java.lang.ExceptionInInitializerError 
    at herkansingTest.PlayerTest.<init>(PlayerTest.java:34) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422) 
    at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:217) 
    at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:266) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:263) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164) 
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110) 
    at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175) 
    at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107) 
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68) 
Caused by: javax.persistence.PersistenceException: Exception [EclipseLink-28019] (Eclipse Persistence Services - 2.6.0.v20150309-bf26070): org.eclipse.persistence.exceptions.EntityManagerSetupException 
Exception Description: Deployment of PersistenceUnit [playerPU] failed. Close all factories for this PersistenceUnit. 
Internal Exception: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.6.0.v20150309-bf26070): org.eclipse.persistence.exceptions.JPQLException 
Exception Description: Problem compiling [select a from Account as a]. 
[14, 21] The abstract schema type 'Account' is unknown. 
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.createDeployFailedPersistenceException(EntityManagerSetupImpl.java:866) 
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:806) 
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.getAbstractSession(EntityManagerFactoryDelegate.java:205) 
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.getDatabaseSession(EntityManagerFactoryDelegate.java:183) 
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getDatabaseSession(EntityManagerFactoryImpl.java:528) 
    at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactoryImpl(PersistenceProvider.java:146) 
    at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:183) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54) 
    at herkansing.TestUtil.<clinit>(TestUtil.java:18) 
    ... 31 more 
Caused by: Exception [EclipseLink-28019] (Eclipse Persistence Services - 2.6.0.v20150309-bf26070): org.eclipse.persistence.exceptions.EntityManagerSetupException 
Exception Description: Deployment of PersistenceUnit [playerPU] failed. Close all factories for this PersistenceUnit. 
Internal Exception: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.6.0.v20150309-bf26070): org.eclipse.persistence.exceptions.JPQLException 
Exception Description: Problem compiling [select a from Account as a]. 
[14, 21] The abstract schema type 'Account' is unknown. 
    at org.eclipse.persistence.exceptions.EntityManagerSetupException.deployFailed(EntityManagerSetupException.java:239) 
    ... 41 more 
Caused by: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.6.0.v20150309-bf26070): org.eclipse.persistence.exceptions.JPQLException 
Exception Description: Problem compiling [select a from Account as a]. 
[14, 21] The abstract schema type 'Account' is unknown. 
    at org.eclipse.persistence.internal.jpa.jpql.HermesParser.buildException(HermesParser.java:155) 
    at org.eclipse.persistence.internal.jpa.jpql.HermesParser.validate(HermesParser.java:347) 
    at org.eclipse.persistence.internal.jpa.jpql.HermesParser.populateQueryImp(HermesParser.java:278) 
    at org.eclipse.persistence.internal.jpa.jpql.HermesParser.buildQuery(HermesParser.java:163) 
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:142) 
    at org.eclipse.persistence.internal.jpa.JPAQuery.processJPQLQuery(JPAQuery.java:223) 
    at org.eclipse.persistence.internal.jpa.JPAQuery.prepare(JPAQuery.java:184) 
    at org.eclipse.persistence.queries.DatabaseQuery.prepareInternal(DatabaseQuery.java:624) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.processJPAQuery(AbstractSession.java:4363) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.processJPAQueries(AbstractSession.java:4323) 
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.initializeDescriptors(DatabaseSessionImpl.java:584) 
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.postConnectDatasource(DatabaseSessionImpl.java:804) 
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:748) 
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:253) 
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:728) 
    ... 39 more 

堆栈跟踪

+0

你得到的错误是什么? – mindriot

+0

请发布整个堆栈跟踪。 – hotzst

+0

现在添加整个堆栈跟踪 – user3197825

回答

1

你可以看到的原因在这里堆栈跟踪:

Exception Description: Problem compiling [select a from Account as a]. 
[14, 21] The abstract schema type 'Account' is unknown. 

JPA无法找到Account实体,不能创建EntityManagerFactory

你必须列出所有的实体persistence.xml像你列出的Player类:

<class>herkansing.Player</class> 
<class>herkansing.Account</class> 
... 

即使你不使用Account实体明确地在你的代码中,有一个名为查询引用它, JPA试图验证此查询,让您的例外:

@NamedQueries({ 
@NamedQuery(name = "Account.getAll", query = "select a from Account as a"), 
@NamedQuery(name = "Account.count", query = "select count(a) from Account as a"), 
@NamedQuery(name = "Account.findByAccountNr", query = "select a from Account as a where a.accountNr = :accountNr") 

})

或者,您可以删除@NamedQueries声明。

+0

非常感谢! – user3197825

相关问题