Java GAE JPA 2.0 Txn快速回滚
又一次,我为以前从未发生过的事情发疯。我已经在我的项目中更改了表示层中的一些文件以及它们自己的实体,与数据处理层无关。有人能告诉我为什么下面的代码会导致这个错误日志吗?我的意思是,为什么它看不到我提交了Txn并关闭了EntityManager。 我用粗体表示警告,因为这是问题所在,而不是NullPointerException。NullPointerException是一个结果,查询没有返回任何内容,而教师保持为null,因为事务回滚了,我不知道为什么Java GAE JPA 2.0 Txn快速回滚,java,google-app-engine,jpa,transactions,Java,Google App Engine,Jpa,Transactions,又一次,我为以前从未发生过的事情发疯。我已经在我的项目中更改了表示层中的一些文件以及它们自己的实体,与数据处理层无关。有人能告诉我为什么下面的代码会导致这个错误日志吗?我的意思是,为什么它看不到我提交了Txn并关闭了EntityManager。 我用粗体表示警告,因为这是问题所在,而不是NullPointerException。NullPointerException是一个结果,查询没有返回任何内容,而教师保持为null,因为事务回滚了,我不知道为什么 String Email = "xyz@x
String Email = "xyz@xyz.com";
EntityManager em = EMF.get().createEntityManager();
em.getTransaction().begin();
TypedQuery<Teacher> query = em.createQuery("SELECT s FROM Teacher s WHERE s.Email = ?1", Teacher.class);
query.setParameter(1, Email);
Teacher teacher = (Teacher)query.getSingleResult();
teacher.getTeacherInf(); // Lazy Parameter
em.getTransaction().commit();
em.close();
//Lazy Parameter must be fetched before closing. Tried without fetching, same result
最后是错误和警告
2014年9月1日上午5:01:28 com.google.apphosting.utils.servlet.TransactionCleanupFilter handleAbandonedTxns
警告:请求已完成,但未提交或回滚id为1的事务。事务将回滚。
2014年9月1日上午5:01:28 com.google.apphosting.utils.jetty.JettyLogger警告
警告:/Login
java.lang.NullPointerException
位于com.google.appengine.datanucleus.query.QueryEntityPfetchFieldManager.FetchLongFieldQueryEntityPfetchFieldManager.java:74
位于org.datanucleus.identity.IdentityUtils.getApplicationIdentityforResultStrowedTityutils.java:101
位于com.google.appengine.datanucleus.EntityUtils.entityToPojoEntityUtils.java:1011
在com.google.appengine.datanucleus.query.DatastoreQuery$2.applyDatastoreQuery.java:229
位于com.google.appengine.datanucleus.query.DatastoreQuery$2.applyDatastoreQuery.java:226
位于com.google.appengine.datanucleus.query.lazyrult.resolvenextlazyrult.java:96
位于com.google.appengine.datanucleus.query.lazyrult.ResolveAllLazyrult.java:121
位于com.google.appengine.datanucleus.query.lazyrult.sizelazyrult.java:115
位于com.google.appengine.datanucleus.query.StreamingQueryResult.sizeStreamingQueryResult.java:151
位于org.datanucleus.store.query.AbstractQueryResult.toArrayAbstractQueryResult.java:400
java:559
位于org.datanucleus.query.evaluator.JavaQueryEvaluator.executeJavaQueryEvaluator.java:160
位于org.datanucleus.query.evaluator.jpqleevaluator.executejjpklevaluator.java:112
位于com.google.appengine.datanucleus.query.JPQLQuery.performExecutejbqlquery.java:200
位于org.datanucleus.store.query.query.executeQueryQuery.java:1789
位于org.datanucleus.store.query.query.executeWithMapQuery.java:1693
位于org.datanucleus.api.jpa.JPAQuery.getSingleResultJPAQuery.java:232
在servelet.User.Login.UserAuthentication.doPostUserAuthentication.java:48
位于javax.servlet.http.HttpServlet.serviceHttpServlet.java:637
位于javax.servlet.http.HttpServlet.serviceHttpServlet.java:717
位于org.mortbay.jetty.servlet.ServletHolder.handleServletHolder.java:511
位于org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilterServletHandler.java:1166
在servelet.Filters.GlobalFilter.doFilterGlobalFilter.java:27
位于org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilterServletHandler.java:1157
位于com.google.appengine.api.socket.dev.DevSocketFilter.doFilterDevSocketFilter.java:74
位于org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilterServletHandler.java:1157
位于com.google.appengine.tools.development.responseWriterFilter.doFilterResponseWriterFilter.java:127
位于org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilterServletHandler.java:1157
位于com.google.appengine.tools.development.headerficationfilter.dofilterheaderficationfilter.java:34
位于org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilterServletHandler.java:1157
在com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilterServeBlobFilter.java:63
位于org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilterServletHandler.java:1157
位于com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilterTransactionCleanupFilter.java:43
位于org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilterServletHandler.java:1157
位于com.google.appengine.tools.development.StaticFileFilter.doFilterStaticFileFilter.java:125
位于org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilterServletHandler.java:1157
位于com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectRequestDevAppServerModulesFilter.java:366
在com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectModuleRequestDevAppServerModulesFilter.java:349
位于com.google.appengine.tools.development.DevAppServerModulesFilter.doFilterDevAppServerModulesFilter.java:116
位于org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilterServletHandler.java:1157
位于org.mortbay.jetty.servlet.ServletHandler.handleServletHandler.java:388
位于org.mortbay.jetty.security.SecurityHandler.handleSecurityHandler.java:216
位于org.mortbay.jetty.servlet.SessionHandler.handleSessionHandler.java:182
在org.mortbay.j
handler.ContextHandler.handleContextHandler.java:765
网址:org.mortbay.jetty.webapp.WebAppContext.handleWebAppContext.java:418
在com.google.appengine.tools.development.devappengineewebappcontext.handledevappengineewebappcontext.java:98
位于org.mortbay.jetty.handler.HandlerWrapper.HandlerWrapper.java:152
位于com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handleJettyContainerService.java:491
位于org.mortbay.jetty.handler.HandlerWrapper.HandlerWrapper.java:152
位于org.mortbay.jetty.Server.handleServer.java:326
位于org.mortbay.jetty.HttpConnection.handleRequestHttpConnection.java:542
位于org.mortbay.jetty.HttpConnection$RequestHandler.contentHttpConnection.java:938
位于org.mortbay.jetty.HttpParser.parsenexthtpparser.java:755
位于org.mortbay.jetty.HttpParser.parseAvailableHttpParser.java:218
位于org.mortbay.jetty.HttpConnection.handleHttpConnection.java:404
位于org.mortbay.io.nio.SelectChannelEndPoint.runSelectChannelEndPoint.java:409
位于org.mortbay.thread.QueuedThreadPool$PoolThread.runQueuedThreadPool.java:582
更新:
我做了一些测试,结果如下:
1主键查找。。。没问题,即使是在数据处理层,它也能像魅力一样发挥作用。
2个TypedQuery提供两种错误:
如果实体存在,我会得到上面发布的警告和错误
B如果实体不存在,我会得到一个结果NotFoundException这很正常
但这里的要点是,查询查找实体,并且仅当实体存在时才查找实体,如果没有结果,则会给出ResultNotFoundException
请注意,在这一点上,我愿意尽一切努力来实现这一点。好吧,我仍然不知道发生了什么,希望得到任何额外的反馈,但似乎只要我删除长ID并将其转换为密钥,尽管另一个实体,同一个项目有很长的主键,所有的工作都很好,查询开始通过像一个魅力。。。无论如何,我希望有更多经验的人能够解释这种行为,因为这一次真的让我着迷了当我使用一个长原语作为我的Id字段时,我得到了与您报告的完全相同的堆栈跟踪。我所要做的就是把类型改成长类
@Entity
public class Teacher implements Serializable
{
private static final long serialVersionUID = 5426530769458891752L;
@Id
private long ID;
private String FName;
private String LName;
private String Email;
@OneToOne(cascade = CascadeType.ALL,fetch=FetchType.LAZY)
private TeacherInfo teacherInf;
// Constructor & getters & setters ...}