grails - 域类中的继承 - 将列继承到基表中

时间:2012-07-17 16:49:44

标签: java grails orm gorm

我有一个Record类:

class Record {
    Date dateCreated
    Date lastUpdated
    def beforeInsert() {
        dateCreated = new Date()
    }
    def beforeUpdate() {
        lastUpdated = new Date()
    }
    static mapping = { tablePerHierarchy false }
}

此类由其他几个域类继承 - 例如:

class User extends Record{
    String userName
    String password
    String email
}

我的问题是:有没有办法将Record表的列嵌入到扩展它的表中?

3 个答案:

答案 0 :(得分:6)

您可以定义tablePerClass或tablePerHierarchy策略。 请参阅此处的文档:http://grails.org/doc/latest/guide/single.html#inheritanceStrategies

因此,请遵循您的代码:

static mapping = {
    tablePerHierarchy true
}    

答案 1 :(得分:2)

您可以在此处使用继承,但这可能会限制您的类层次结构。我对GORM的熟悉程度不如直接休眠(这是GORM使用的)。如果你发现你想使用合成而不是继承,我相信这样的东西会起作用(虽然我没试过):

@Embeddable class AuditTimestamps { ... }

class User {
   @Embedded AuditTimestamps auditTimestamps

   def beforeInsert() { auditTimestamps.beforeInsert() }
   def beforeUpdate() { auditTimestamps.beforeUpdate() }

}

我做了类似于直接java / hibernate的东西,它就像一个魅力。

答案 2 :(得分:0)

首先,如果您的问题是dataCreated和dateUpdated,那么您不需要这里的光彩!您可以将这些字段放在域中,而GORM会神奇地将它们填满! 如果您的计划是不在任何地方添加它们,您可以在src/groovy目录中创建一个Groovy类,然后继承它们!

如果你有一个复杂的继承树,那么注入那些动态属性也可能是一个解决方案!你可以在bootstrap中做到这一点!

def grailsApplication // Autowiring

grailsApplication.domainClasses.each { domainClass -> 
    // add the fields you want to the metaclass
}

如果您计划在更新前插入数据并插入,则覆盖beforeInsertbeforeUpdate方法。从metaClass重写这些方法的缺点是你不能在实际的域类中使用它们。

第三种方法是使用自定义eventListners并处理GORM(Hibernate)事件。有关详细信息,请查看here,作者将演示如何从插件中执行此操作!我相信你可以根据你的用途进行映射。