域名有一些共同的领域,扩展域名还是嵌入式?

时间:2012-05-09 16:53:12

标签: grails dns domain-driven-design gorm

当我设计数据库时。我使用嵌入式嵌入公共字段。但它不能初始化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
}
   }

或使用extends?

   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
}
   }

`

对我来说什么是正确的?

2 个答案:

答案 0 :(得分:1)

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

一般情况下,我会远离像CreatedUpdated这样的类,它们只是属性的集合,而不是域中的实际对象。 Java / Groovy只有单继承,所以这只适用于你有这样一个基类的情况。

此外,针对该特定情况,创建并更新了时间戳can automatically be applied by GORM。如果您使用的是Spring安全保护,请查看audit-trail plugin以自动创建createdByupdatedBy列。

答案 1 :(得分:0)

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