2012-02-02 4 views
0

私はGrailsに接続しようとしている従来のテーブルを持っています。物事を簡単にするモデルを単純化するつもりです。テーブルには2つのフィールドがあります: "NAME"は文字列型で "CPAR"はInteger型であり、テーブルのID(プライマリキー)のように動作します。Grailsを使って新しい自動生成プライマリキーフィールドをレガシーテーブルに追加するには?

私がしたいのは、下位互換性のために "CPAR"を保持し、テーブルに新しいフィールド "ID"を挿入して、実際にテーブルのプライマリキーにすることです。ここで

は、自分のドメインクラスです:

Class Partners { 

    Long id 
    String name 
    Integer cpar 

    static mapping = { 
     table "PARTNERS" 
     version false 

     columns { 
      id column: "ID", generator: "sequence" 
      name column: "NAME" 
      cpar column: "CPAR" 
     } 
    } 
} 

私は、このアプリケーションを実行すると、それはテーブル内のIDフィールドを作成しますが、すべての行がゼロ(「ID」フィールドはゼロであり、全体ではなく行が移入されています)。それは、私のエラーを与える足場のWebインターフェイスを介してアプリケーションにアクセスしようとしている:nullオブジェクトのプロパティ 'ID'を取得することはできません。私が望むのは、これらの "ID"フィールドにゼロの代わりに適切な値が入力されるようにすることです。どうすればこれを達成できますか?使用しているデータベースはFirebirdです。

答えて

0

私はFirebirdに慣れていませんが、OracleとMySqlに似たシーケンスを使用していると思います。最初の問題は、Long idの宣言です。 HibernateはあなたのIDを提供しますので、このコード行は必要ありません。次に、列を定義するときに使用する順序を指定できます。

static mapping = { 
    columns { 
     id column: "ID", generator:'sequence', params:[name:'PARTNERS_ID_SEQ'] 
    } 
} 

は、私はいつもちょうどmapping{}クロージャの内部で、私の列マッピングのすべてを行っているので、私は上記のコードが動作する100%わからないcolumns{}閉鎖を使用したことがありません。そうでない場合は、columns{}の外に発電機と名前を移動することができ、それが動作するはずです:マッピングレガシーテーブルについて、具体的

static mapping = { 
    columns { 
     id column: "ID" 
    } 
    id generator:'sequence', params:[name:'PARTNERS_ID_SEQ'] 
} 

この記事会談: http://dave-klein.blogspot.com/2008/03/grails-orm-dsl-rules.html

これは、マッピングのGrailsのドキュメントですシーケンス名について実際には話していないID: http://grails.org/doc/latest/ref/Database%20Mapping/id.html

関連する問題