当我设计数据库时。我使用嵌入式嵌入公共字段。但它不能初始化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
}
}
`
对我来说什么是正确的?
答案 0 :(得分:1)
我肯定会将此示例嵌入而不是继承。我不认为你应该仅根据对象包含公共字段的事实来进行此调用。相反,如果使用标准OO设计技术对模型有意义,则应使用继承。例如,如果“myClass是myBaseClass”不成立,则继承可能是错误的解决方案。
一般情况下,我会远离像CreatedUpdated
这样的类,它们只是属性的集合,而不是域中的实际对象。 Java / Groovy只有单继承,所以这只适用于你有这样一个基类的情况。
此外,针对该特定情况,创建并更新了时间戳can automatically be applied by GORM。如果您使用的是Spring安全保护,请查看audit-trail plugin以自动创建createdBy
和updatedBy
列。
答案 1 :(得分:0)
在这种特殊情况下,audit-trail插件应该满足要求。但是,如果您对其他没有插件可用的字段有这样的要求,则可能的解决方案之一可能是在编译时通过AST Transformation注入此类公共字段。内部审计跟踪插件使用此概念来注入这些字段。根据您的要求,您可以使用全局AST转换或本地AST转换。