我无法找出使用 Google App Engine 和 JDO 更新“嵌套”数据的正确方法。我有一个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,然后进行上述更新,它最终会附加新成分,然后当从数据存储区重新获取配方时,这些新成分会与旧成分一起返回。(为什么还要麻烦复制?我在前端使用 GWT,所以我将 JDO 对象复制到 DTO,用户在前端对其进行编辑,然后将它们发送到后端进行更新数据存储。)
为什么我手动创建的对象(设置所有字段,包括 id)与对 PersistenceManager 返回的实例进行操作会得到不同的结果?显然 JDO 的字节码增强以某种方式参与其中。
我最好在坚持更新的配方之前明确删除旧成分吗?
(附带问题——还有其他人对 ORM 感到沮丧,并希望我们可以回到普通的旧 RDBMS 吗?:-)