سؤال

أنا أكتب تطبيق Grails صغيرًا، وأستمر في الحصول على StaleObjectStateException:s لحوالي 1/10: من الاستدعاءات إلى "createfoo" عند تشغيل التعليمات البرمجية البسيطة التالية إلى حد ما.على الأرجح أنني أفتقد أفضل طريقة لاستخدام GORM.

هذا هو الرمز:

def viewfoo = {
  session.user.refresh()
  // ...
}

def createfoo = {
  session.user.refresh()
  var user = session.user
  if (param["name"]) {
    var newFoo = new Foo()
    newFoo.name = param["name"]
    if (newFoo.validate()) {
      newFoo.save()
      if (user.validate()) {
        user.addToFoos(newFoo)
      } else {
        user.discard()
      }
    } else {
      newFoo.discard()
    }
  }
}

أسئلتي بخصوص أفضل ممارسات GORM:

  1. هل "if-validate()-then-save()-else-discard()" هي الطريقة الصحيحة لاستمرار كائن جديد في GORM؟

  2. هل يجب علي التحقق من صحة جميع الكائنات التي أنا على وشك حفظها ()؟أي.هل يجب علي التحقق من صحة كل من كائن Foo وكائن المستخدم في الكود أعلاه؟هل سيؤدي التحقق من صحة كائن المستخدم إلى التحقق ضمنيًا من حالة كائن Foo؟

  3. ماذا فعلت لأستحق StaleObjectStateException؟:-)

استثناء GORM/الإسبات:

Caused by: Object of class [Foo] with identifier [15]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [Foo#15]
هل كانت مفيدة؟

المحلول

لست متأكدًا تمامًا من سبب طرح المشكلات، ولكن هناك دمج طريقة على كائنات المجال.يتيح لك إعادة ربط الكائن الحالي بالسياق المستمر الحالي.

لا أعرف ما يكفي عن ما هو Foo الخاص بك، أو ما هي التخصيصات التي أجريتها على كائن المستخدم، أو إصدار Grails/Java الذي تستخدمه حتى تتمكن من إعادة إنتاج هذا.

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

أيضًا، أعتقد أن سلوك التحقق ثم التجاهل يتغير وأقل ضرورة في Grails 1.1 بناءً على التعليقات الموجودة على هذا المشنور

نصائح أخرى

شيء واحد لاحظته هو أنك لا تقوم بحفظ المستخدم، على الرغم من أنك أضفت للتو بعض foo إليه.في الواقع، يجب أن يؤدي حفظ المستخدم إلى تجنب الحاجة إلى حفظ foo.

ليس عليك التحقق من صحة المستخدم:ولا يتم تغيير خصائصه بواسطة مصدر غير موثوق به، ويتم فحص القيود على مستوى قاعدة البيانات على أي حال كلما قمت بالحفظ.

وأخيرًا، من الأفضل نقل أشياء مثل user.refresh()‎ خارج إجراءاتك إلى أداة اعتراض أو مرشح.

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