再有一次,我要为以前从未发生过的事情发疯。我已经在项目中更改了一些文件(在表示层及其所拥有的实体中,与数据处理层无关)。有人可以告诉我为什么以下代码会导致此错误日志吗?我的意思是为什么它没有看到我已经提交了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/