【问题标题】:makePersistent failing with JDO使用 JDO 的 makePersistent 失败
【发布时间】:2012-01-26 18:18:46
【问题描述】:

我将以下代码部署到应用引擎服务器(唯一 我可以测试 JDO 的地方,不幸的是我无法在本地测试 JDO 因为我没有本地 BigTable 实现)。

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.");

如图所示,客户端接收到来自服务器的第一行输出,而第二行没有,这意味着 makePersistent() 失败。

有人知道为什么会这样吗?

【问题讨论】:

标签: java google-app-engine jdo


【解决方案1】:

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

【讨论】:

  • 谢谢,我怀疑可能是这种情况,但不确定。我认为解决方案是使 List 非静态并放入一个静态成员函数,该函数使用 JDOQL 来检索整个代码中使用的 Data 类的单个实例。任何关于这种方法的cmets?谢谢,约翰·戈奇
  • 事实上,我决定使用 { writer.write(e.toString(); } 进行调试,这是错误消息:org.datanucleus.jdo.exceptions.ClassNotPersistenceCapableException: The class "The class" java.util.ArrayList" 是不可持久的。这意味着它要么没有被增强,要么文件的增强版本不在 CLASSPATH 中(或被未增强的版本隐藏),或者元数据/注释找不到该类。” 是不可持久的。这意味着它没有被增强,或者文件的增强版本不在 CLASSPATH 中(或者被未增强的隐藏
  • 此外,您将 List 传递给 makePersistent 是完全错误的。你将一个持久化对象传递给 makePersistent。
【解决方案2】:

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

【讨论】:

猜你喜欢
  • 2011-12-28
  • 2013-02-21
  • 1970-01-01
  • 2013-01-11
  • 2012-08-29
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多