2009-01-28 23 views
7

Küçük Grails uygulaması yazıyorum ve aşağıdaki oldukça basit bir kod çalıştırırken "createfoo" çağrılarının yaklaşık 1/10: s için StaleObjectStateException: s almaya devam ediyorum. Muhtemelen GORM'i kullanmanın en iyi yolunu kaçırıyorum.) (Başka-atma - (o-kaydedin) -GORM Grails ve StaleObjectStateException

  1. "eğer-validate() mı: Gorm iyi uygulamaları konusunda

    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() 
        } 
        } 
    } 
    

    Benim sorulara

    :

    Bu

    kodudur "GORM'de yeni bir nesneyi sürdürmenin doğru yolu?

  2. Kaydetmek üzere olduğum tüm nesneleri doğrulamalı mıyım()? Yani Yukarıdaki kodda hem Foo nesnesini hem de Kullanıcı nesnesini doğrulamalı mıyım? Kullanıcı nesnesini doğrulamak, Foo nesnesinin durumunu gizli olarak kontrol eder mi?

  3. StaleObjectStateException'ı hak etmek için ne yaptım? :-)

Gorm/hazırda istisna: Ben fark

 
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] 

cevap

2

Neden sorunlara yol açtığınızdan tam olarak emin değilim, ancak etki alanı nesnelerinde merge yöntemi var. Mevcut nesneyi mevcut kalıcı içeriğe yeniden bağlamanıza izin verir.

Foo'nuzun ne olduğu, Kullanıcı nesnesinde ne tür özelleştirmeler yaptığınız veya bunları yeniden üretebilmek için kullandığınız grails/java sürümü hakkında yeterince bilgi sahibi değilim.

Kullanıcı arabiriminde yaptığınız yenilemenin veritabanı sürümünün güncellenmesine (ve dolayısıyla eşitlenmemesine) neden olan bir şey olduğunu düşünüyorum, ancak emin olamıyorum. Ayrıca

, ben validate sonra davranış this post

yapılan yorumlar dayalı grails 1.1 daha az gerekli değişen ve atmak inanıyoruz
2

Bir şey size sadece kendisine bazı foo ekledik rağmen kullanıcıyı tasarruf değil olmasıdır. Aslında, kullanıcı kaydetme foo kaydetme ihtiyacını ortadan kaldırmalıdır.

Kullanıcıyı doğrulamak zorunda değilsiniz: özellikleri güvenilmeyen bir kaynak tarafından değiştirilmiyor ve veritabanı düzeyi kısıtlamaları her kaydettiğinizde yine de kontrol ediliyor.

Son olarak, user.refresh() gibi şeyler, eylemlerinizin dışında ve bir engelleyiciye veya filtreye daha iyi taşınır.