Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine Google应用程序引擎JDO-查询结果集不可修改_Google App Engine_Jdo - Fatal编程技术网

Google app engine Google应用程序引擎JDO-查询结果集不可修改

Google app engine Google应用程序引擎JDO-查询结果集不可修改,google-app-engine,jdo,Google App Engine,Jdo,我在这里看到了一个类似的问题,但它没有回答我的问题,所以我决定开始一个新的问题 我试图通过将最后添加的对象临时存储在一个静态变量中,来解决GoogleAppEngine的高复制数据存储的一致读取不一致问题() 每当用户添加一个新的航班,而不是直接持久化新的航班对象,它会将其作为静态变量存储在PMF中 因此,当在查询中获取航班列表时,它会将结果存储到列表中,并将列表与上次添加的对象进行比较,如果上次添加的对象不在列表中,我会手动将上次添加的对象添加到列表中 但是,使用此方法,每当列表中缺少新添加的

我在这里看到了一个类似的问题,但它没有回答我的问题,所以我决定开始一个新的问题

我试图通过将最后添加的对象临时存储在一个静态变量中,来解决GoogleAppEngine的高复制数据存储的一致读取不一致问题()

每当用户添加一个新的航班,而不是直接持久化新的航班对象,它会将其作为静态变量存储在PMF中

因此,当在查询中获取航班列表时,它会将结果存储到列表中,并将列表与上次添加的对象进行比较,如果上次添加的对象不在列表中,我会手动将上次添加的对象添加到列表中

但是,使用此方法,每当列表中缺少新添加的对象并且我手动添加它时,就会出现以下异常

Oct 6, 2012 2:19:38 PM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: /
java.lang.UnsupportedOperationException: Query result sets are not modifiable
    at org.datanucleus.store.query.AbstractQueryResult.add(AbstractQueryResult.java:222)
    at com.jimfoo88.helloorm.GetFlights.queryJDO(GetFlights.java:101)
    at com.jimfoo88.helloorm.GetFlights.doGet(GetFlights.java:50)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:35)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:60)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:94)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:370)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
我下面的代码基于google应用程序引擎示例HelloORM

我只显示为简化阅读而修改的部分

AddFlight.java java
//2008谷歌公司版权所有。保留所有权利。
包com.jimfoo88.helloorm;
导入javax.jdo.JDOHelper;
导入javax.jdo.PersistenceManagerFactory;
/**
*@作者马克斯·罗斯
*/
公共期末班{
添加私有静态对象lastObjectAdded;
私有静态最终PersistenceManagerFactory实例=JDOHelper.getPersistenceManagerFactory(“事务可选”);
公共静态对象getLastObjectAdded(){
已添加的返回对象;
}
已添加公共静态无效setLastObjectAdded(Object lastObject){
lastObjectAdded=lastObject;
}
公共静态PersistenceManagerFactory get(){
返回实例;
}
私有PMF(){}
}
GetFlights.java
private Collection queryJDO(字符串查询){
PersistenceManager pm=PMF.get().getPersistenceManager();
试一试{
List flights=(List)pm.newQuery(query.execute();
//在关闭实体之前,强制撤回所有结果
//经理。
//我们也可以打电话给pm.detachCopyAll()
flights.size();
//下午三时(所有航班);
布尔值=false;
试一试{
适用于(f航班:航班){
如果((航班)PMF.getLastObjectAdded()==null){
发现=真;
打破
}
如果(f.getDest()==((航班)PMF.getLastObjectAdded())
.getDest()
&&f.getOrig()==((航班)PMF
.getLastObjectAdded()).getOrig()){
logger.info(“找到的对象”+f.toString()
+“在数据存储中”);
发现=真;
打破
}
}
if(found==false){
logger.info(“未找到对象”
+(Flight)PMF.getLastObjectAdded()
+“在数据存储中,需要添加它”);
flights.add((flights)PMF.getLastObjectAdded());
}
}捕获(NullPointerException e){
logger.error(例如getMessage());
}
返程航班;
}最后{
pm.close();
}
}

如果有人能指出我的错误,我将不胜感激。如果有更好的方法解决这个问题,请让我知道。谢谢。

所以查询结果不可修改,所以不要尝试向其添加对象。我看不出有任何不正确或不一致的地方(事实上,JDO/JPA规范就是这么说的)


如果您想在以后的上下文中使用这些结果,您可以轻松地创建一个新列表,对查询结果执行addAll(),然后使用该列表,这样查询结果就不可修改,所以不要尝试向其中添加对象。我看不出有任何不正确或不一致的地方(事实上,JDO/JPA规范就是这么说的)


如果您想在以后的上下文中使用这些结果,您可以轻松地创建一个新列表,对查询结果执行addAll(),然后使用该列表

我认为detachCopyAll会起作用,我想我下次应该更加关注规范。谢谢detachCopyAll返回一个副本。你不只是继续使用queryi返回的列表,我认为detachCopyAll可以工作,我想下次我应该更加关注规范。谢谢detachCopyAll返回一个副本。您不只是继续使用查询返回的列表
private void doPostJDO(Flight f) {
    PersistenceManager pm = PMF.get().getPersistenceManager();
    PMF.setLastObjectAdded(f);
    try {
      pm.makePersistent(f);
    } finally {
      pm.close();
    }
  }
// Copyright 2008 Google Inc. All Rights Reserved.
package com.jimfoo88.helloorm;

import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManagerFactory;

/**
 * @author Max Ross <maxr@google.com>
 */
public final class PMF {

    private static Object lastObjectAdded;

  private static final PersistenceManagerFactory INSTANCE = JDOHelper.getPersistenceManagerFactory("transactions-optional");

  public static Object getLastObjectAdded() {
    return lastObjectAdded;
}

public static void setLastObjectAdded(Object lastObject) {
    lastObjectAdded = lastObject;
}

public static PersistenceManagerFactory get() {
    return INSTANCE;
  }

  private PMF() {}
}
private Collection<Flight> queryJDO(String query) {
        PersistenceManager pm = PMF.get().getPersistenceManager();
        try {
            List<Flight> flights = (List<Flight>) pm.newQuery(query).execute();
            // Force all results to be pulled back before we close the entity
            // manager.
            // We could have also called pm.detachCopyAll()
            flights.size();
            //pm.detachCopyAll(flights);
            boolean found = false;
            try {
                for (Flight f : flights) {
                    if ((Flight) PMF.getLastObjectAdded() == null) {
                        found = true;
                        break;
                    }
                    if (f.getDest() == ((Flight) PMF.getLastObjectAdded())
                            .getDest()
                            && f.getOrig() == ((Flight) PMF
                                    .getLastObjectAdded()).getOrig()) {
                        logger.info("found object " + f.toString()
                                + "in datastore");
                        found = true;
                        break;
                    }
                }
                if (found == false) {
                    logger.info("did not find object "
                            + (Flight) PMF.getLastObjectAdded()
                            + " in datastore, need to add it");
                    flights.add((Flight) PMF.getLastObjectAdded());
                }
            } catch (NullPointerException e) {
                logger.error(e.getMessage());
            }
            return flights;
        } finally {
            pm.close();
        }
    }