2013-01-25 126 views
0

我有这个问题,它的2天我不明白为什么会发生。 我想验证登录。我的代码:(持久性)无法创建实体管理器

public String Verify(String name, String password) { 
String admin=""; 
    Query q = emf 
      .createEntityManager() 
      .createQuery(
        "SELECT u FROM user u where u.name = :name and u.password=:password"); 
    q.setParameter("name", name); 
    q.setParameter("password", password); 
    User u = (User) q.getSingleResult(); 

    if (u.getAdmin().equalsIgnoreCase("yes")) { 
     admin = "yes"; 
    } else { 
     admin = "no"; 
    } 

    return admin; 
} 

我再收到此错误:

java.lang.NullPointerException 
at db.DbProcessor.Verify(DbProcessor.java:19) 
at controller.VerifikoServlet.doGet(VerifikoServlet.java:25) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
at java.lang.Thread.run(Thread.java:722) 

第19行是 “.createEntityManager()”

+0

**调试**和** **记录总是有帮助的 - 否则你'EntityManagerFactory'可能不被初始化。即使你可以拆分你的代码,那么你会看到哪一步是空的。 – gaborsch

+0

我在哪里以及如何“emf”我猜是一个EntityManagerFactory实例?看起来它可能是空的......你是否正在使用一些依赖注入? –

+0

它在这种情况下帮助不大:)但是我怎么能初始化呢? –

回答

1

我解决了这一问题写这个初始化实体厂长:

private static EntityManagerFactory factory = Persistence 
     .createEntityManagerFactory("PROJECT_NAME"); 
EntityManager em = factory.createEntityManager(); 
0

的问题是,你尚未初始化EntityManagerFactory。正如我所看到的,您正在Servlet环境中运行。

看看这个链接,供您阅读它可能是有用的:http://weblogs.java.net/blog/ss141213/archive/2005/12/dont_use_persis_1.html

+0

是的我可以得到它,进一步解释我在一个类中使用持久性,然后我从这个servlet调用这个类方法。我会尝试,我会回应:) –

0

如果持久层加载是不是这个东西,我们可以通过简单地添加下面的代码来验证: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 ;

static { 
    try { 
     factory = Persistence.createEntityManagerFactory("MyPu"); 
    } catch (Throwable ex) { 
     logger.error("Initial SessionFactory creation failed", ex); 
     throw new ExceptionInInitializerError(ex); 
    } 
} 

...

}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

请没有这是获取实体管理器工厂对象的常用工具。但是这里重要的是异常处理,即ExceptionInInitializerError ...

这将清楚地表明是否存在任何与您的实体类相关的问题,例如对于日期类型变量或类似的缺失TemporalType。

因此,如果假设您在实体类中使用NamedQuery,但即使由于持久性将无法加载它,因为实体类中缺少类型或所需属性(如Date类型的TemoralType)。

所以一定要处理异常提到

相关问题