我再次坚持以前从未发生过的事情。我在项目中更改了一些文件(在表示层和实体中自己,并且与数据处理层无关)。有人可以告诉我为什么以下代码会导致此错误日志?我的意思是为什么它没有看到我提交了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。
请在这一点上,我愿意尝试任何事情和所有事情来实现这一目标。
答案 0 :(得分:0)
好吧,我仍然不知道发生了什么,并希望任何添加的反馈,但似乎只要我删除了长ID并将其转换为密钥(虽然另一个实体,同一个项目有Long主键所有的工作都很好),查询开始像一个魅力...无论如何,我希望有一个有更多经验的人可以解释这种行为因为这个真的让我
答案 1 :(得分:0)
当我使用long
(原始)作为我的Id字段时,我得到了与您报告的完全相同的堆栈跟踪。我所要做的就是将类型更改为Long
(类)。