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 に戻りたいと思っている人はいますか? :-)