2011-11-08 16 views
6

Grails'e yeniyim. Alanımda, String olarak tanımladığım bir alanım var.AutoIncrement alanları dışındaki not alanlarından

String ponum 

i sayfası oluşturmak ilk kez tıklayın, "ponum" alanı 0001 gösterilecek vardır ve ben "ponum" alanı 0002 gösterilecek sahiptir ikinci kez tıkladığınızda daha sonra database.And kaydetmek zorundadır ve daha sonra veritabanında kaydetmek zorunda. Bir kez "ponum" alanı oluşturmak için "ponum" alan tıklamak ve database.I google kaydetmek zorunda, ama herhangi bir belge almadım. Teşekkürler

+1

(otomatik grails tarafından eklenir) sürümü alanı. Grails, satır her güncellendiğinde otomatik olarak artar, bu nedenle aradığınız tek şey sizin için işe yarayabilir. – Todd

cevap

6

şeyler (sizin standart id genaerator ile düzenli rdbms kullanarak varsayarak) zaten bir kimliği olsun, Neden sadece kimliği temel alan bir ponum varmış gibi davranmıyorsunuz?

Sadece alan adı sınıfına bir alıcı ekleyin: Ayrıca satır güncellendi kaç kez söyler

class Page { 
    String getPonum() { 
    String.format("%04d", id) 
    } 
} 
+0

Cevabınız için teşekkürler, benim için çalışıyorum.Ama sayfanın üzerine tıkladıktan sonra "null" yazıyor. Oluşturma sayfasında yeni ponumu göstermem gerek. –

+0

@SathishKumar Ahhh ... kimlik ilk kaydedilene kadar oluşturulmamış ... Bunu şu şekilde değiştirebilirsin: id? String.format ("% 04d", id): Kaydedilmeden önce kullanıcıya bir şey göstermek için "Kayıtlı değil" ya da (veritabanı bunları destekliyorsa) "sequence" gibi bir şey kullanın. Ancak bu, 'sayfa oluştur' seçeneğinin tıklatılması, veritabanına asla girmeyecek çok sayıda yeni ponümü yaratacağı anlamına gelir. –

1

this answer'a göre, bunu yapmak için hazırda beklemeli jeneratörler (ids için kullanılanlar) kullanmak mümkün değildir. Hazırda bekletme jeneratörü kullanmanız gerekiyorsa, cevapta da bir geçici çözüm açıklanmaktadır. Senin durumunda

, yeni bir nesneyi eklerken sizin ponum özelliğini jeneratöre bir önleme kullanabilirsiniz:

class Yours { 
    int ponum 

    def beforeInsert() { 
    def lastPonum = Book.list([sort: 'ponum', order:'desc', max: 1]) 
    if(lastPonum) 
     ponum = (lastPonum.pop().ponum as int) + 1 as String 
    else 
     ponum = '0' 
    } 
} 
+3

Bu cevap thread-safe değildir. Eşzamanlı olarak iki iş parçacığınız varsa, ikisi de aynı ponuma sahip olacaklardır. – mmigdol

İlgili konular