4

我有一个记录类:

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
}

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

4

3 回答 3

6

您可以定义tablePerClasstablePerHierarchy策略。 请参阅此处的文档

因此,您应该使用以下代码:

static mapping = {
    tablePerHierarchy true
}    
于 2012-07-17T16:57:56.550 回答
2

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

@Embeddable class AuditTimestamps { ... }

class User {
   @Embedded AuditTimestamps auditTimestamps

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

}

我已经完成了类似这样的事情,它是直接的 java/hibernate,它的工作原理就像一个魅力。

于 2012-07-17T17:27:30.003 回答
0

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

如果您有一个复杂的继承树,那么动态注入这些属性也可能是一个解决方案!您可以在引导程序中执行此操作!

def grailsApplication // Autowiring

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

如果您打算在更新和插入之前调整数据,则覆盖beforeInsertandbeforeUpdate方法。从 metaClass 覆盖这些方法的缺点是您不能在实际的域类中使用它们。

第三种方法是使用自定义 eventListners 并处理 GORM(Hibernate) 事件。有关详细信息,您应该在这里查看,作者正在演示如何从插件中做到这一点!确信您可以映射它以适合您的使用。

于 2014-11-24T06:30:58.510 回答