Java 使用JDO进行持久化失败

Java 使用JDO进行持久化失败,java,google-app-engine,jdo,Java,Google App Engine,Jdo,我已将以下代码部署到app engine服务器(唯一 我可以测试JDO的地方,不幸的是我不能在本地测试JDO 因为我没有本地BigTable实现) 最终类PMF{ 私有静态最终PersistenceManagerFactory pmf=JDOHelper.getPersistenceManagerFactory(“事务可选”); 私有PMF(){} 公共静态PersistenceManagerFactory get(){return pmf;} } @持久的 类数据{ // ... @持久的 私

我已将以下代码部署到app engine服务器(唯一 我可以测试JDO的地方,不幸的是我不能在本地测试JDO 因为我没有本地BigTable实现)

最终类PMF{
私有静态最终PersistenceManagerFactory pmf=JDOHelper.getPersistenceManagerFactory(“事务可选”);
私有PMF(){}
公共静态PersistenceManagerFactory get(){return pmf;}
}
@持久的
类数据{
// ...
@持久的
私有静态列表存储=新建ArrayList();
静态列表getStores(){
退货商店;
}
}
...
Data.getStores().add(store);
writer.write(“该行已被客户确认接收”);
PMF.get().getPersistenceManager().makePersistent(Data.getStores());
writer.write(“客户从未收到此行”);
如图所示,客户端接收到来自服务器的第一行输出,而第二行没有,这意味着makePersistent()失败


有人知道为什么会发生这种情况吗?

也许一个简单的事实是,没有标准的Java持久性API提供静态字段的持久性

通过使用ant或EclipseAppengine插件在本地运行代码,您可以在本地机器上模拟BigTable。eclipse插件还可以在后台运行datanucleus,并且可以为您捕获这样的错误,而无需在您进行更改时上传到appengine。

谢谢,我怀疑可能是这样,但不确定。我认为解决方案是使列表成为非静态的,并放入一个静态成员函数,该函数使用JDOQL检索代码中使用的数据类的单个实例。对这种方法有何评论?谢谢,John Goche事实上我决定用{writer.write(e.toString();}进行调试,下面是错误消息:org.datanucleus.jdo.exceptions.ClassNotPersistenceCapableException:the class“the class”java.util.ArrayList不可持久。这意味着它可能尚未增强,或者文件的增强版本不在类路径中(或者被未增强版本隐藏),或者找不到类的元数据/批注。不可持久。这意味着它未被增强,或者文件的增强版本不在类路径中(或者被一个未加密的文件隐藏,并且还添加了一个事实,即您正在将一个列表传递到makePersistent中,这是完全错误的。您将一个可持久化对象传递到makePersistent中。在Rick Mangi回复后,您可以复制在测试中完成的操作。这就是JDO插件最初的开发方式。谢谢,我现在正在运行co在本地执行de,结果与在服务器上相同,但我遇到了以下问题,我不知道如何处理:
final class PMF {

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

  private PMF() { }

  public static PersistenceManagerFactory get() { return pmf; }

}

@PersistenceCapable
class Data {
  // ...
  @Persistent
  private static List<Store> stores = new ArrayList<Store>();

  static List<Store> getStores() {

    return stores;

  }

}

...

Data.getStores().add(store);
writer.write("this line received OK by client.");
PMF.get().getPersistenceManager().makePersistent(Data.getStores()); 
writer.write("this line never received by client.");