2012-05-09 5 views
1

私はデータベースを設計するときに使用します。一般的なフィールドを埋め込むために埋め込みを使用しますが、initCreatedとcreatedByはできません。ドメインを拡張するか、埋め込みは一般的なフィールドを処理する正しい方法ですか? コードを入力してくださいドメインに共通のフィールドがいくつかあり、ドメイン拡張または埋め込みですか?

class Created { 
     Date dateCreated 
     Long createdBy 
     def beforeInsert() 
      { 
      dateCreated= new Date() 
      createdBy=0 
     } 
    } 

class Updated { 

Date lastUpdated 
Long updatedBy 

//it works? 
def beforeUpdate(){ 
    lastUpdated=new Date() 
    updatedBy=0 
} 
//it works? 
def beforeInsert(){ 
    lastUpdated=new Date() 
    updatedBy=0 
} 
} 


class CreatedUpdated { 

Created created 

Updated updated 

//Must use the embedded option, or the type of exception, can not find CreatedUpdated 
static embedded = ['created','updated'] 
} 

class Term { 

String name 

CreatedUpdated createdUpdated 

static embedded = ['createdUpdated'] 

    Term parent 

    static hasMany =[terms:Term] 

    static mapping = { 
     version false 
    } 

    String toString() 
    { 
    name 
    } 

static constraints = { 
    name unique:true,size: 1..20 
    parent nullable: true 
    createdUpdated display:false,nullable:true 
    terms display:false 
    url url: true 
} 
    } 

または使用しますか?

class Term extends CreatedUpdated{ 
    String name 

    Term parent 

    static hasMany =[terms:Term] 

    static mapping = { 
     version false 
    } 

    String toString() 
    { 
    name 
    } 

static constraints = { 
    name unique:true,size: 1..20 
    parent nullable: true 
    terms display:false 
    url url: true 
} 
    } 

`

右私には何ですか?

答えて

1

私は間違いなく継承されているのではなく、この例を埋め込んでいます。オブジェクトに共通のフィールドが含まれているという事実だけに基づいてこの呼び出しを行うべきではないと思います。代わりに、標準のOO設計テクニックを使用してモデルに合っていれば、継承を使用する必要があります。たとえば、 "myClass is myBaseClass"がtrueでない場合、継承はおそらく間違った解決策です。

一般に、CreatedUpdatedのようなクラスは、プロパティのコレクションであり、ドメインの実際のオブジェクトではありません。 Java/Groovyは単一の継承しか持たないため、このような基本クラスが1つしかない場合にのみ動作します。

さらに、その特定の場合、作成され、更新されたタイムスタンプcan automatically be applied by GORM。春のセキュリティを使用している場合は、をチェックして、createdByupdatedByの列を自動的に作成してください。

+0

thanks.audit-trail pluginは良いです。私はこの質問をする理由は誰もが私が思う態度を持っているわけではありません – sjbwylbs

0

この特定のケースでは、監査証跡プラグインが要件を満たしている必要があります。しかし、プラグインが利用できない他のフィールドにこのような要件がある場合、可能な解決策の1つは、AST Transformationによってコンパイル時にそのような共通フィールドを注入することです。内部監査追跡プラグインは、この概念を使用してこれらのフィールドを注入します。要件に応じて、グローバルASTトランスフォーメーションまたはローカルASTトランスフォーメーションを使用できます。

関連する問題