2012-07-17 83 views
4

我有一个记录类为:的Grails - 继承域类 - 继承列插入基表

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表的列嵌入扩展它的表中?

+5

在这种情况下,不需要'beforeInsert'或'beforeUpdate',因为'dateCreated'和'lastUpdated'都将由Grails为您设置和更新。请参阅http://grails.org/doc/latest/guide/GORM.html#eventsAutoTimestamping中的“自动加盖时间戳”部分。 – 2012-07-17 19:33:57

回答

2

你可以在这里使用继承,但是可能会限制你的类层次结构。我不像GORM那样熟悉GORM(这是GORM使用的)。如果你发现你想用的组合物,而不是继承,我相信这样的事情会的工作(我还没有尝试过,虽然):

@Embeddable class AuditTimestamps { ... } 

class User { 
    @Embedded AuditTimestamps auditTimestamps 

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

} 

我已经做了一些完全一样,这是直的Java /休眠和它的作用就像一种魅力。

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,作者正在演示如何从插件执行此操作!确保您可以将其映射以适合您的使用。

+0

看起来monogo已经让您大开眼界。 – 2015-01-01 09:39:57