2011-08-08 18 views
2

ドメインクラスを作成すると、すべてのドメインクラス(テーブル)の "id"と "version"カラムが自動的に追加されます。たとえば、列を追加する場合はどうすればよいですか? "isChecked"これは "id"と "version"の列が追加されるのと同じ方法で、すべてのドメインクラス(つまりテーブル)に自動的に追加されるべきです。どのようにこれを達成することができますし、特定のドメインクラスに対して "isChecked"を設定したくない場合でも、それを行うことができます。Grails - すべてのドメインオブジェクトにカスタムフィールド(列)を追加する - 自動的に

Grail 1.3.7ではどのようにすることができますか?

ありがとうございます。 ジェイチャンドラン

編集:入力を増やせますか?提案された回答がうまくいかなかった!

+0

を適応させることは、私はより多くの入力を得ることができますか?提案された回答がうまくいかなかった! –

答えて

3

Groovyが提供するメタプログラミングの魔法を使うことができますが、私はもっと典型的なルートに行き、継承を使うでしょう。 isChecked(および必要なもの)を含む親ドメインを作成し、そのクラスの拡張が必要な​​ドメインを作成します。

+0

親クラスの '' 'mapping''クロージャでは、table-per-subclassスキームを優先してtable-per-hierarchyスキームを無効にすることをお勧めします。 – codelark

+0

@codelark例を挙げてこれを詳しく説明できますか? –

+0

@Jay Chandran [GORM docs](http://grails.org/doc/latest/guide/single.html#5.5.2%20Custom%20ORM%20Mapping)に例があります。セクション5.5.2.3。 – codelark

0

あなたのドメイン成果物を変更する(プロパティを追加する)プラグインを作成することをお勧めします。 plugins and artifactsについて詳しく読むことができます。静的なプロパティ(静的なnochecked = trueなど)を簡単に追加して、新しいアトリビュートを追加したくないドメイン成果物を除外することができます。

-1

メタプログラミングを使用してこれを行うことができます。プロパティを追加するコードは、プラグインのdoWithDynamicMethodsクロージャーまたはBootstrap.groovyのいずれかで実行する必要があります。プラグインのアプローチを使用している場合、このような何かが動作するはずです:

def doWithDynamicMethods = {ctx -> 
    application.domainClasses 
     .findAll {it.simpleName.startsWith('S')}.metaClass.each {domainMetaClass -> 

    Integer fooVal = 0 

    domainMetaClass.getFoo = {-> fooVal} 
    domainMetaClass.setFoo = {Integer newFooVal -> fooVal = newFooVal} 
    } 
} 

上記のコードは、名前が「S」で始まるすべてのドメインクラスにInteger fooプロパティを追加する必要があります。私はこのコードをテストしていないので、おそらく動作しません。あなたが詳細については確信でき例を参照するには、次の

  1. はそれが修正追加するプラグインを検索するドメインクラス(例えば、フィールドやメソッドを追加します)
  2. は、プラグインのコードでそれを
  3. ルックをダウンロード記述子のdoWithDynamicMethods閉鎖
  4. コピー、ペーストし、あなたのニーズに
+0

これはHibernateでは認識されないため、永続化には使用できませんでした。 –

関連する問題