2012-05-09 43 views
1

當我設計database.I使用嵌入嵌入常見字段。但它不能初始化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 
} 
    } 

`

什麼是我的權利?

回答

1

我肯定會讓這個例子嵌入而不是繼承。我認爲你不應該僅僅根據對象包含公共字段的事實來調用這個調用。相反,如果使用標準OO設計技術的模型有意義,則應該使用繼承。例如,如果「myClass是myBaseClass」不適用,繼承可能是錯誤的解決方案。

一般來說,我會遠離類似CreatedUpdated的類,它們只是屬性的集合,而不是來自域的實際對象。 Java/Groovy只有單一的繼承,所以這隻適用於你有一個這樣的基類。

另外,對於該特定情況,創建並更新時間戳can automatically be applied by GORM。如果您使用彈簧安全性,請檢查audit-trail plugin以自動創建createdByupdatedBy列。

+0

thanks.audit-trail插件很好。我問這個問題的原因是看不是每個人都有我認爲的態度 – sjbwylbs

0

在這種特殊情況下,audit-trail插件應該滿足要求。但是,如果您對其他沒有插件的字段有這樣的要求,那麼可能的解決方案之一就是在編譯時通過AST Transformation注入這些公共字段。內部audit-trail插件使用這個概念來注入這些字段。根據您的要求,您可以使用全局AST轉換或局部AST轉換。