javax.jdo.JDODetachedFieldAccessException JDO应用程序引擎

时间:2012-01-27 17:28:19

标签: google-app-engine jdo

我收到以下错误:

javax.jdo.JDODetachedFieldAccessException:您刚刚尝试访问字段“admin”但是在分离对象时此字段未分离。要么不访问此字段,要么在分离对象时将其分离。

这里我有一个Store对象列表,其中Admin字段为子类。

我第一次调用此函数

static List<Store> getStores() {

  PersistenceManager pm = PMF.get().getPersistenceManager();

  Query query = pm.newQuery(XZStore.class);
  List<Store> stores = (List<Store>) query.execute();
  //need to detatch them here
  stores = (List<Store>) pm.detachCopyAll(stores);
  pm.close();
  return stores;    
}

然后访问每个商店的管理员字段(store.admin)。

我想如果我分离了CopyAll(商店)那么我也会分离成员 商店的元素。不是吗?

我甚至尝试过以下但没有运气:

for (Store store : stores)
  store.setAdmin(pm.detachCopy(store.getAdmin()));

谢谢,

John Goche

我终于找到了解决方案。以下对我有用 (分离容器元件没有拆除该构件 元素和我必须分开做。)

PersistenceManager pm = PMF.get().getPersistenceManager();

Query query = pm.newQuery(Store.class);
List<Store> stores = (List<Store>) query.execute();
//need to detatch them here
List<Store> detachedStores = new ArrayList<Store>();
for (Store store : stores) {
  Store detachedStore = pm.detachCopy(store);
  AdminUser detachedAdmin = pm.detachCopy(store.getAdmin());
  detachedStore.setAdmin(detachedAdmin);
  detachedStores.add(detachedStore);
}

pm.close();

此致

John Goche

1 个答案:

答案 0 :(得分:0)

我认为阅读JDO文档和JDO规范会让您受益更多,尤其是获取计划/组和默认提取组等部分。你的“解决方案”效率低下。