2011-11-08 29 views
6

我是新來的Grails。我在我的域對象中有一個字段,我將其定義爲String自動增量字段除了在grails中的Id

String ponum 

當我點擊第一次上創建頁面,在「ponum」字段顯示0001,後來它在database.And保存,當我在第二次「ponum」字段顯示技術點擊後來它必須保存在數據庫中。每次我點擊創建頁面「ponum」字段必須自動增加並保存它database.I谷歌,但我沒有得到任何文件。 謝謝

+1

版本字段(這是由Grails的自動添加)也告訴你有多少次該行已被更新。每次更新行時,Grails都會自動增加它,所以如果這就是您要找的所有內容,它可能適用於您。 – Todd

回答

6

隨着事態得到一個ID反正(假設你使用標準的ID genaerator一個常規的RDBMS)爲什麼不假裝有一個基於ID的變量ponum

只是吸氣劑添加到您的域類:

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

感謝您爲我工作的答覆。但是當我點擊創建頁面時,它顯示「null」。我不需要在創建頁面中顯示新的ponum。 –

+0

@SathishKumar Ahhh ... id在創建之前不會被創建...您可以將其更改爲:id? String.format(「%04d」,id):'Not saved'在保存之前向用戶顯示某些內容,或者如果您的(數據庫支持)則使用類似'sequence'的內容。然而,這意味着點擊'create page'會創建大量新的'ponum's,它們可能永遠不會進入數據庫 –

1

根據this answer,不可能使用hibernate生成器(那些用於ids)來做到這一點。如果您確實需要使用Hibernate生成器,則在答案中也會介紹一種解決方法。

在你的情況,你可以使用攔截器插入一個新的對象時,發電機的ponum屬性:

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

這個答案不是線程安全的。如果你有兩個線程同時進行插入,他們將得到相同的ponum。 – mmigdol