java - GAE JPA 2.0 Txn快速回滚

标签 java google-app-engine jpa transactions

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

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)
    在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)
    在org.datanucleus.store.query.AbstractQueryResult.toArray(AbstractQueryResult.java:400)
    在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)
    在org.datanucleus.api.jpa.JPAQuery.getSingleResult(JPAQuery.java:232)
    在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)
    在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。

请在这一点上,我愿意尝试一切尝试,使它正常工作。

最佳答案

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

关于java - GAE JPA 2.0 Txn快速回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25597794/

相关文章:

java - 检查按钮是否按住一段时间或是否只是单击 ANDROID

java - 在Java中使用正则表达式匹配子域和顶级域

Java GridBagLayout定位

java - appengine 单元测试仅获取 10 个实体

django - Rietveld 是否与 App Engine 密不可分?

java - 如何在 JPA 查询中选择最佳匹配

java - 如何使用 Swig 将数组从 Java 传递到 C++?

java - 什么会导致 GAE 查询中出现 "java.lang.IllegalArgumentException: Type mismatch"?

database - 我使用 spring data jpa 的 native 查询有问题

java - 使用 JPA 将新实例添加到表中