2010-11-23 7 views
5

ドメインクラスを切り替えて、そのIDに可変長のUUIDを使用したいとします。私は単純にURLに逐次IDを表示して、人々が試して混乱させるようにしたくありません。可変長を可能にするJava UUIDメソッドのカスタムバージョンを作成しましたので、大きく成長しないモデルでは短いIDを使用できます。カスタムID生成をGrailsでデフォルトとして定義する最良の方法は何ですか?

「割り当て済み」に変更できるように、デフォルトのマッピングを変更する方法を説明したこのスレッドが見つかりました。 Modify Id generation for a Grails Plugin

デフォルトのbeforeInsertを(カスタムUUIDを生成するために)設定し、Grailsに整数の代わりに文字列を使いたい場合は、どうすればいいですか?

私はgrails.gorm.default.beforeInsertを設定に追加しようとしましたが、動作しませんでした。

+2

ataylorさんの答えは以下の通りですが、私は通常、生成されたIDをデータベースに残しておき、ある種の相関IDを必要とするオブジェクトに別の文字列/ GUIDフィールドを追加しました。エンドユーザーに公開される。 このようにして、grails/hibernateとデータベースがチューニングされている(そしてSQLを書くのが簡単です)通常の結合/外部キーの動作が得られますが、その外部IDが必要なときにもそうです。 –

+0

それは私が前にやったことですが、idによってそれを行うので、あなたはデフォルトのキャッシュを失うことを読んでいます。そして、私はdb(または私たちは代替キーを持っている)に対して何かをしないようにしようとするので、私はこれを撃つつもりです。 – ahanson

答えて

7

idsに文字列を使用させるには、プロパティーString idを宣言するだけです。カスタムのUUIDを設定するには、beforeInsertではなく、Hibernate IDジェネレータを使用します。 org.hibernate.id.IdentifierGeneratorを拡張するクラスを作成し、ドメインクラスに、このようなIDジェネレータマッピングを追加します。

class MyIdGenerator extends IdentifierGenerator { 
    Serializable generate(SessionImplementor session, Object object) { 
     return MyUUID.generate() 
    } 
} 

class MyDomain { 
    String id 
    static mapping = { 
     id generator:"my.package.MyIdGenerator", column:"id", unique:"true" 
    } 
} 
1

この質問は古いですが、それはまだ検索しても見せています。これは現在、Grails 2.3で行われています。 (私はpostgresを使用していますので、 "pg-uuid"タイプに注意してください。

UUID uuid  
static mapping = { 
    uuid generator: 'uuid2', type: 'pg-uuid' 
    ... 
} 
+0

grails 2.5.4で確認済みの作品 –

関連する問題