GORM继承自定义标识符

时间:2016-09-01 08:01:21

标签: inheritance grails gorm

我目前正在创建一些域类的审核,并创建了一个AuditingListener来调用ServiceMethod来保存旧数据。

在本服务方法中,我通过一些命名约定获得域类的审计类。

一切正常,但现在我正在处理审计类的问题。 审计类从基本域类扩展,如下所示:

class Foo {
   String baaar
}    
class FooAudit extends Foo {
    Long auditId
    Date auditDate = new Date()
}

我的问题是,我希望FooAudit保留Foo的ID,并拥有自己的ID属性。 在将创建审计条目的服务方法中,我获取原始域类对象的所有属性的映射。 我想在此地图中设置FooAudit的属性,但地图还包含id的{​​{1}}属性。

如果我按地图设置属性,如

Fooo

这会将def auditEntry = new FooAudit() auditEntry.properties = map 的标识设置为与FooAudit相同,但我想拥有Foo

的标识

如何将属性FooAudit设置为auditId的标识符?

2 个答案:

答案 0 :(得分:1)

作为一个例子,对于使用特殊情况复制属性的情况,我有一个带有静态方法的类,如下所示(也许它很有用......你可以按照自己喜欢的方式处理id。 ..)

static def fillObjectProperties(def map, def obj, def excludeArray, def typeConvMap) {
    map.each {
        if (obj.hasProperty(it.key) && !excludeArray.contains(it.key)) {
            try {
                if (it.value == null || it.value.size() == 0) {
                    obj.setProperty(it.key, null)
                }
                else if (typeConvMap.containsKey(it.key)) {
                    if (typeConvMap[it.key] == 'int') {
                        obj.setProperty(it.key, it.value as int)
                    } else if (typeConvMap[it.key] == 'BigDecimal') {
                        obj.setProperty(it.key, it.value as BigDecimal)
                    } else if (typeConvMap[it.key] == 'Date') {
                        Date date = new Date()
                        date.clearTime()
                        date.set(date: map[it.key + '_day'] as int, month: (map[it.key + '_month'] as int) -1, year: map[it.key + '_year'] as int)
                        obj.setProperty(it.key, date)
                    }
                } else {
                    obj.setProperty(it.key, it.value)
                }
            } catch(Exception ex) {}
        }
    }
}

static def copyObjectProperties(def source, def target) {
    target.metaClass.properties.each{
        if (it.name != 'metaClass') {
           it.setProperty(target, source.metaClass.getProperty(source, it.name))
        }
    }
    return source
}

答案 1 :(得分:0)

也许你可以创建一个可以容纳所有必要属性的基类?

class FooBase{
    String baaar
}

class Foo extends FooBase{
}

class FooAudit extends FooBase {
    Long auditId
    Date auditDate = new Date()
}