2011-11-08 5 views
6

Grailsを初めて使用しました。私はStringと定義する私のドメインオブジェクトにフィールドを持っています。GrailsのId以外のAutoIncrementフィールド

String ponum 

私はページを作成する上で初めてをクリックし、「れるPONum」フィールドには、0001を表示するために持っていると私は「れるPONum」フィールドが0002を表示するために有する第2の時間をクリックすると、後でそれがdatabase.Andに保存することがあります後でそれはデータベースに保存する必要があります。私はページを作成する "ponum"フィールドをクリックすると、autoincrementしてdatabase.I Googleを保存する必要がありますが、私はすべてのドキュメントを取得していません。 ありがとう

+1

(自動的にGrailsによって追加された)バージョンフィールドは、行が更新された回数を示します。行が更新されるたびにGrailsは自動的にそれをインクリメントするので、それがあなたが探しているものなら、あなたのために働くかもしれません。 – Todd

答えて

6

物事はとにかくIDを取得すると(標準のid genaeratorとの定期的なRDBMSを使用して、あなたと仮定して)、どうしてidに基づいた変数ponumがあるのではないでしょうか?

ちょうどあなたのドメインクラスにゲッターを追加します。

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

返信ありがとうございますme.But私は "null"を表示しているページを作成するをクリックします。代わりに、私はページを作成する新しいponumを表示する必要があります。 –

+0

@SathishKumar Ahhh ... idは最初に保存されるまで作成されません。あなたはそれをidに変更できますか? String.format( "%04d"、id):ユーザーに保存する前に何かを表示したり、(データベースがサポートしている場合は) 'sequence'のようなものを使用します。しかし、これは 'create page'をクリックすると決してデータベースに入れないかもしれないたくさんの新しい' ponum'を作り出すことを意味します –

1

this answerによると、これを行うにはハイバーネーションジェネレータ(IDに使用されるもの)を使用することはできません。実際に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

この回答はスレッドセーフではありません。 2つのスレッドが同時に挿入を行っている場合、それらは同じponumを取得します。 – mmigdol

関連する問題