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

我肯定会让这个例子嵌入而不是继承。我认为您不应该仅仅基于对象包含公共字段的事实来进行此调用。相反,如果使用标准 OO 设计技术对您的模型有意义,则应该使用继承。例如,如果“myClass is a myBaseClass”不成立,那么继承可能是错误的解决方案。

一般来说,我会远离CreatedUpdated那些只是属性集合而不是您域中的实际对象的类。Java/Groovy 只有单一继承,所以只有当你有一个这样的基类时才有效。

此外,对于这种特殊情况, GORM 可以自动应用创建和更新的时间戳。如果您使用的是 spring security,请查看用于自动创建和列的audit-trail 插件。createdByupdatedBy

于 2012-05-09T18:32:43.297 回答
0

在这种特殊情况下,审计跟踪插件应该足以满足要求。但是,如果您对没有可用插件的其他字段有这样的要求,那么可能的解决方案之一可能是在编译时通过AST Transformation注入这些公共字段。内部审计跟踪插件使用这个概念来注入这些字段。根据您的要求,您可以使用全局 AST 转换或本地 AST 转换。

于 2012-05-10T04:21:25.667 回答