1

データベースを設計するとき、埋め込みを使用して共通フィールドを埋め込みますが、dateCreatedと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
}
   }

`

私にとって正しいことは何ですか?

4

2 に答える 2

1

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

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

また、その特定のケースでは、作成および更新されたタイムスタンプをGORMによって自動的に適用できます。スプリングセキュリティを使用している場合は、列を自動的に作成するための監査トレイルプラグインを確認してください。createdByupdatedBy

于 2012-05-09T18:32:43.297 に答える
0

In this particular case audit-trail plugin should suffice the requirements. However if you have such requirement for other fields wherein no plugin is available, then one of the possible solution could be to inject such common fields at compile time via AST Transformation. Internally audit-trail plugin uses this concept to inject those fields. Depending upon your requirement you can either use Global AST Transformations or Local AST Transformations.

于 2012-05-10T04:21:25.667 に答える