我有麻烦找出适当的方式更新的"嵌套的"数据使用的是谷歌的应用程序的发动机 和被创建.我有一个 RecipeJDO 和一个 IngredientJDO.

我希望能够完全 替换成分 在给定的食谱实例与新的名单成分。然后,当那个食谱是(重新)持续存在,任何以前附加的成分将被删除,完全从数据存储库,并且新的人将保留和相关配方。

是这样的:

  // retrieve from GAE datastore
  RecipeJDO recipe = getRecipeById();    

  // fetch new ingredients from the user
  List<IngredientJDO> newIngredients = getNewIngredients();
  recipe.setIngredients(newIngredients);

  // update the recipe w/ new ingredients
  saveUpdatedRecipe(recipe);

这个作品的时候我更新(分离)配方的物体直接,因为返回的数据存储库。然而,如果我 复制 一RecipeJDO,然后作出上述更新,它结束了追加的新的成份,然后返回沿用旧的成份当的食谱后的重新获取的数据存储库。(为什么要这么麻烦的复制吗?我使用的应用程序上的前端,所以我复制的被创建的对象,以交互、用户编辑他们在前端,然后他们被送到后台用于更新数据存储库。)

为什么我获得的不同结果的对象,我创造的一方面(设置的所有领域,包括id)与操作上的情况返回的PersistenceManager?显然 被创建的字节增强参与。

我更明确,删除旧的成份之前保持更新 食谱吗?

(侧的问题-没有任何人会感到沮丧,与奥姆和希望我们能回到普通的老RDBMS?:-)

有帮助吗?

解决方案

短的回答。改变 RecipeJDO.setIngredients() 这样的:

public void setIngredients(List<IngredientJDO> ingredients) {
  this.ingredients.clear();
  this.ingredients.addAll(ingredients);
}

当你获取的RecipeJDO, ingredients 清单不是一个真正的 ArrayList, 它是一个动态的代理,处理持续存中所含的要素。你不应该取代它。

虽然持续管理是开放的,你可以迭代过 ingredients 列表中,项目添加或删除的项目,这些变化将会持续存在的持久性管理是关闭(或事务承诺,如果你是在一个事务)。这里就是你怎么会做的更新,没有一个交易:

public void updateRecipe(String id, List<IngredientDTO> newIngredients) {
  List<IngredientJDO> ingredients = convertIngredientDtosToJdos(newIngredients);
  PersistenceManager pm = PMF.get().getPersistenceManager();
  try {
    RecipeJDO recipe = pm.getObjectById(RecipeJDO.class, id);
    recipe.setIngredients(ingredients);
  } finally {
    pm.close();
  }
}

如果你永远不会修改的 IngredientJDO 对象(只更换他们并阅读),您可能想要让他们 Serializable 对象,而不是被创建的对象。如果你这样做,你可能可以重复使用的 Ingredient 类应用程序RPC代码。

顺便说一句,甚至如果 Recipe 不是被创建的对象,你会想做一个副本 setIngredients() 方法,否则个人可以做这样的:

List<IngredientJDO> ingredients = new ArrayList<IngredientJDO>;
// add items to ingredients
recipe.setIngredients(ingredients);
ingredients.clear(); // Woops! Modifies Recipe!

其他提示

我面临同样的问题!我想要更新现有实体通过调makePersistent()以及分配一个存在的id/钥匙!更新工作得很好除了嵌套的对象!嵌套的对象是所附的老人而不是被替换?我不知道如果这是意欲行为,或者如果这是一个错误?我希望复盖,以具有同等效力插入一个新的实体!

如何关于删除旧的实体和持续的新的一样的交易?这工作吗?我尝试了这个,但它致使中删除的实体完全?!我不知道为什么(即使我试图洗直接后删除)!

@NamshubWriter,不知道如果你会抓住这个岗位...关于你的评论,

(如果你用条和JSP,可以避免的应用程序RPC和应用程序模型表示的食谱和成分)

使用条和JSP,但我面临同样的问题。当用户提交的形式回,条例化我实体对象从头开始,因此被创建完全无知。当我叫PersistenceManager.makePersistent的根本目的,以前的版本是正确的复盖-有一个例外,它的 儿童 对象 所附的 来的 列表<child> 以前的版本。

如果你能表明任何解决方案(比手动复制的对象的领域),我将非常感谢。

(看条纹是如此可插入的,我不知道,如果我可以替代它如何实例的实体对象...)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top