更新的"嵌套的"目的与被创建在谷歌上应用程序的发动机
-
18-09-2019 - |
题
我有麻烦找出适当的方式更新的"嵌套的"数据使用的是谷歌的应用程序的发动机 和被创建.我有一个 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> 以前的版本。
如果你能表明任何解决方案(比手动复制的对象的领域),我将非常感谢。
(看条纹是如此可插入的,我不知道,如果我可以替代它如何实例的实体对象...)