2013-01-25 73 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)。

所以一定要處理異常提到

相關問題