GAE JPA 2.0 Txn快速回滚

时间:2014-09-01 01:22:47

标签: java google-app-engine jpa transactions

我再次坚持以前从未发生过的事情。我在项目中更改了一些文件(在表示层和实体中自己,并且与数据处理层无关)。有人可以告诉我为什么以下代码会导致此错误日志?我的意思是为什么它没有看到我提交了Txn并关闭了EntityManager。 我以粗体显示警告,因为这是问题,而不是NullPointerException。 NullPointerException是一个结果,查询没有返回任何东西,老师保持null,因为事务回滚,我不知道为什么。

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

这是Teacher.class

@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 ...}

最后是错误和警告

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警告

警告:/登录

显示java.lang.NullPointerException     在com.google.appengine.datanucleus.query.QueryEntityPKFetchFieldManager.fetchLongField(QueryEntityPKFetchFieldManager.java:74)     at org.datanucleus.identity.IdentityUtils.getApplicationIdentityForResultSetRow(IdentityUtils.java:101)     在com.google.appengine.datanucleus.EntityUtils.entityToPojo(EntityUtils.java:1011)     在com.google.appengine.datanucleus.query.DatastoreQuery $ 2.apply(DatastoreQuery.java:229)     在com.google.appengine.datanucleus.query.DatastoreQuery $ 2.apply(DatastoreQuery.java:226)     在com.google.appengine.datanucleus.query.LazyResult.resolveNext(LazyResult.java:96)     在com.google.appengine.datanucleus.query.LazyResult.resolveAll(LazyResult.java:121)     在com.google.appengine.datanucleus.query.LazyResult.size(LazyResult.java:115)     在com.google.appengine.datanucleus.query.StreamingQueryResult.size(StreamingQueryResult.java:151)     at org.datanucleus.store.query.AbstractQueryResult.toArray(AbstractQueryResult.java:400)     at java.util.ArrayList.addAll(ArrayList.java:559)     在org.datanucleus.query.evaluator.JavaQueryEvaluator.execute(JavaQueryEvaluator.java:160)     在org.datanucleus.query.evaluator.JPQLEvaluator.execute(JPQLEvaluator.java:112)     在com.google.appengine.datanucleus.query.JPQLQuery.performExecute(JPQLQuery.java:200)     在org.datanucleus.store.query.Query.executeQuery(Query.java:1789)     在org.datanucleus.store.query.Query.executeWithMap(Query.java:1693)     at org.datanucleus.api.jpa.JPAQuery.getSingleResult(JPAQuery.java:232)     at servelet.User.Login.UserAuthentication.doPost(UserAuthentication.java:48)     在javax.servlet.http.HttpServlet.service(HttpServlet.java:637)     在javax.servlet.http.HttpServlet.service(HttpServlet.java:717)     在org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)     在org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1166)     at servelet.Filters.GlobalFilter.doFilter(GlobalFilter.java:27)     在org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)     在com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)     在org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)     在com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:127)     在org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)     在com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)     在org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)     在com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63)     在org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)     在com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)     在org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)     在com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)     在org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)     在com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectRequest(DevAppServerModulesFilter.java:366)     在com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectModuleRequest(DevAppServerModulesFilter.java:349)     在com.google.appengine.tools.development.DevAppServerModulesFilter.doFilter(DevAppServerModulesFilter.java:116)     在org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)     在org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)     在org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)     在org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)     在org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)     在org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)     在com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:98)     在org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)     在com.google.appengine.tools.development.JettyContainerService $ ApiProxyHandler.handle(JettyContainerService.java:491)     在org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)     在org.mortbay.jetty.Server.handle(Server.java:326)     在org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)     在org.mortbay.jetty.HttpConnection $ RequestHandler.content(HttpConnection.java:938)     在org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755)     在org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)     在org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)     在org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)     在org.mortbay.thread.QueuedThreadPool $ PoolThread.run(QueuedThreadPool.java:582)

更新

我做了一些测试,结果如下: 1)主键查找...没问题,即使通过数据处理层也像魅力一样。 2)TypedQueries有两种错误:    A)如果实体存在,我得到NullPointerException(上面发布的警告和错误)    B)如果实体不存在,我得到一个ResultNotFoundException(这很正常)

但这里的重点是查询找到实体,只有在它存在时才这样做,如果没有结果,它会给出ResultNotFoundException。

请在这一点上,我愿意尝试任何事情和所有事情来实现这一目标。

2 个答案:

答案 0 :(得分:0)

好吧,我仍然不知道发生了什么,并希望任何添加的反馈,但似乎只要我删除了长ID并将其转换为密钥(虽然另一个实体,同一个项目有Long主键所有的工作都很好),查询开始像一个魅力...无论如何,我希望有一个有更多经验的人可以解释这种行为因为这个真的让我

答案 1 :(得分:0)

当我使用long(原始)作为我的Id字段时,我得到了与您报告的完全相同的堆栈跟踪。我所要做的就是将类型更改为Long(类)。