2010-02-15 295 views
1
public void addEmp(String emp_name, String emp_sal, String did) { 
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("transactions-optional");  
    EntityManager em = emf.createEntityManager(); 
    try { 

     String s = did; 

     EntityTransaction transaction = em.getTransaction(); 
     transaction.begin(); 
     System.out.println("value of Department_name is::" + s); 



     Query q = em.createQuery("select from com.wissen.enterprisebysush.server.domainobject.Department d"); 
     Department dept = (Department) q.getResultList().get(0); 
     System.out.println("Name of Department is::" + dept.getDept_name()); 


     Employee e = new Employee(); 
     e.setEmp_name("Abvc"); 
     e.setEmp_sal("5000"); 
     e.setDepartment(dept); 
     em.persist(e); 

     System.out.println("Transaction: " + transaction); 

     transaction.commit(); 
     em.close(); 

    } catch (NullPointerException e) { 
     e.printStackTrace(); 
     System.out.println("Exception::" + e.getCause()); 
    } finally { 
    } 
} 

我得到NullPointerExceptiontransaction.commit();。 所以我无法添加Department对象中Employee为什么在这段代码中会出现NullPointerException?

交易:[email protected] java.lang.NullPointerExceptionException ::空

at com.google.appengine.api.datastore.KeyFactory.stringToKey(KeyFactory.java:181) 
at org.datanucleus.store.appengine.DatastoreElementContainerStoreSpecialization.extractElementKey(DatastoreElementContainerStoreSpecialization.java:170) 
at org.datanucleus.store.appengine.DatastoreAbstractCollectionStoreSpecialization.contains(DatastoreAbstractCollectionStoreSpecialization.java:57) 
at org.datanucleus.store.mapped.scostore.AbstractCollectionStore.contains(AbstractCollectionStore.java:116) 
at org.datanucleus.sco.backed.List.contains(List.java:455) 
at org.datanucleus.state.RelationshipManager.processManyToOneBidirectionalRelation(RelationshipManager.java:690) 
at org.datanucleus.state.RelationshipManager.process(RelationshipManager.java:294) 
at org.datanucleus.state.JDOStateManagerImpl.processManagedRelations(JDOStateManagerImpl.java:2377) 
at org.datanucleus.ObjectManagerImpl.performManagedRelationships(ObjectManagerImpl.java:2706) 
at org.datanucleus.ObjectManagerImpl.flush(ObjectManagerImpl.java:2744) 
at org.datanucleus.ObjectManagerImpl.preCommit(ObjectManagerImpl.java:2886) 
at org.datanucleus.TransactionImpl.internalPreCommit(TransactionImpl.java:348) 
at org.datanucleus.TransactionImpl.commit(TransactionImpl.java:235) 
at org.datanucleus.jpa.EntityTransactionImpl.commit(EntityTransactionImpl.java:104) 
at com.wissen.enterprisebysush.server.GreetingServiceImpl.addEmp(GreetingServiceImpl.java:92) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:527) 
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:166) 
at com.google.gwt.user.server.rpc.RemoteServiceServlet.doPost(RemoteServiceServlet.java:86) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:713) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:806) 
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093) 
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) 
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360) 
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) 
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712) 
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) 
at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:54) 
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139) 
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:306) 
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139) 
at org.mortbay.jetty.Server.handle(Server.java:313) 
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506) 
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:844) 
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:644) 
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211) 
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381) 
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:396) 
at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442) 

commiting我的交易前打印出来仍然出现错误。

+2

请发布e.printStackTrace()的输出,因为这会告诉我们NPE的确切位置。 –

+0

你确定NPE不会发生在'transaction.begin()'? 'em.getTransaction()'返回一个非空值吗? – JRL

回答

0

当你得到NPEtransaction.commit(),那么transactionnull

+0

不正确。 NPE可以发生在'commit'方法的任何地方。此外,在事务代码中,“transaction”不能为空。 –

+0

@wic:你的意思是不能为空? – JRL

+0

@wic:在这种情况下,我会争辩说,“在transaction.commit()”是误导性的:他在调用内部某个地方获得NPE,但不在该线上。 –

1

根据堆栈跟踪,问题出现在“Google App Engine的DataNucleus插件”中。我狩猎了一下,似乎有一个关于这个特殊问题的错误here

它看起来像被修复并且后来验证(2009年8月14日)。所以也许你可以尝试以后的版本,看看问题是否会消失?

+0

谢谢你的解决方案。空指针异常消失了,但现在它进入异步的成功部分和打印成功,但没有反映到数据存储。 – user273422

相关问题