我有一个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表的列嵌入到扩展它的表中?
答案 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
}
如果您计划在更新前插入数据并插入,则覆盖beforeInsert
和beforeUpdate
方法。从metaClass重写这些方法的缺点是你不能在实际的域类中使用它们。
第三种方法是使用自定义eventListners并处理GORM(Hibernate)事件。有关详细信息,请查看here,作者将演示如何从插件中执行此操作!我相信你可以根据你的用途进行映射。