تحديث الكائنات "المتداخلة" مع JDO على محرك تطبيق Google

StackOverflow https://stackoverflow.com/questions/1482570

سؤال

أواجه مشكلة في معرفة الطريقة الصحيحة لتحديث البيانات "المتداخلة" باستخدام محرك تطبيق Google و JDO. انا املك recipejdo. و Ingredientjdo..

أريد أن أكون قادرا تماما استبدال المكونات في حالة وصفة معينة مع قائمة جديدة من المكونات. بعد ذلك، عندما تكون هذه الوصفة (إعادة) مستمرة، سيتم حذف أي مكونات مرفقة مسبقا تماما من DataStore، وسيتم استمرار المرتبط بالصفة الجديدة.

شيء مثل:

  // 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);

يعمل هذا بشكل جيد عندما أقوم بتحديث كائنات وصفة (منفصلة) مباشرة، كما عاد من DataStore. ولكن إذا كنت ينسخ enciewjdo، ثم قم بإجراء التحديثات المذكورة أعلاه، فهو ينتهي بإلغاء المكونات الجديدة، والتي يتم إرجاعها بعد ذلك مع المكونات القديمة عند إعادة عرض الوصفة من DataStore. (لماذا تهتم بالنسخة على الإطلاق؟ أنا أستخدم GWT على الواجهة الأمامية، لذلك أنا نسخ كائنات JDD إلى DTOS، يقوم المستخدم بتحريرها على الطرف الأمامي، ثم يتم إرسالها إلى الخلفية لتحديث مخزن البيانات.)

لماذا أحصل على نتائج مختلفة مع الكائنات التي أتخلقها باليد (إعداد جميع الحقول، بما في ذلك المعرف) VS التشغيل على المثيلات التي تم إرجاعها بواسطة persistencemanager؟ من الواضح أن التحسين bytecode jdo يشارك بطريقة ما.

هل أنا أفضل حالا حذف المكونات القديمة بشكل صريح قبل الاستمرار في الوصفة المحدثة؟

(سؤال جانبي - هل يشعر أي شخص آخر بالإحباط بالخمور وأتمنى أن نعود إلى 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 الكائنات بدلا من كائنات jdo. إذا قمت بذلك، فقد تكون قادرا على إعادة استخدام Ingredient فئة في رمز GWT RPC الخاص بك.

بالمناسبة، حتى لو Recipe لم يكن كائن JDD، فأنت تريد إجراء نسخة في setIngredients() الطريقة، وإلا يمكن لشخص ما القيام بذلك:

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

نصائح أخرى

أواجه نفس المشكلة! أرغب في تحديث كيان موجود عن طريق استدعاء الإجراءات المختصرة () وتعيين معرف موجود / مفتاح! التحديث يعمل بشكل جيد باستثناء الكائنات المتداخلة! يتم إلحاق الكائنات المتداخلة إلى القديم بدلا من استبدالها؟ لا أعرف إذا كان هذا هو السلوك المقصود أو إذا كان هذا خطأ؟ أتوقع الكتابة فوقها أن يكون لها نفس التأثير مثل إدراج كيان جديد!

ماذا عن حذف الكيان القديم أولا واستمرت في نفس المعاملة الجديدة؟ هل هذا فعال؟ حاولت هذا لكنه أدى إلى حذف الكيان بالكامل؟! لا أعرف لماذا (على الرغم من أنني حاولت التنظيف مباشرة بعد حذف)!

NamshubWriter، لست متأكدا مما إذا كنت ستقوم بالقبض على هذا المنشور ... بخصوص تعليقك،

(إذا كنت قد استخدمت المشارب و JSP، فيمكنك تجنب تمثيلات GWT RPC و GWT من الوصفة والمكون)

أنا صباحا باستخدام المشارب و JSP، لكنني تواجه نفس المشكلة. عندما يقدم المستخدم النموذج مرة أخرى، يقوم المشارب بمفانيا كائنات كولي من الصفر، وبالتالي فإن JDO جاهل تماما. عندما أسمت persistencemanager.makepersistent على كائن الجذر، يتم الكتابة في الإصدار السابق بشكل صحيح - مع استثناء واحد طفل الكائنات ملحق إلى قائمةu003Cchild> من الإصدار السابق.

إذا كان بإمكانك اقتراح أي حل (أفضل من نسخ حقول الكائنات يدويا)، فسأكون ممتنا للغاية.

(رؤية كمشرائط قابلة للتوصيل، أتساءل عما إذا كان بإمكاني تجاوز كيفية إنهاء كائنات الكيان ...)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top