例如,假设我想让该列设置为数据库默认设置的任何内容,而不在域类中重新定义该默认设置?
我通过谷歌找不到太多东西。有迹象表明,如果我直接使用 Hibernate,我可以将该特定列/属性设置为私有,这可能会完成我所寻求的。
我当然可以不定义该列,GORM 会忽略它。但是每当 Grails 应用程序进行选择时,我都需要其中的值。
例如,假设我想让该列设置为数据库默认设置的任何内容,而不在域类中重新定义该默认设置?
我通过谷歌找不到太多东西。有迹象表明,如果我直接使用 Hibernate,我可以将该特定列/属性设置为私有,这可能会完成我所寻求的。
我当然可以不定义该列,GORM 会忽略它。但是每当 Grails 应用程序进行选择时,我都需要其中的值。
您可以像在doc中一样使用 GORM 可插入属性,也可以通过事件读取值beforeInsert
:
class Book {
String title
String isbn
static mapping = {
isbn nullable: false
}
def beforeInsert {
title = queryFromDatabase...
}
}
我认为您必须使用 beforeInsert / Hibernate 拦截器路线,因为您的要求是从现有数据库中读取默认值。
您可以使用 JDBC 的DatabaseMetaData.getColumns读取列的数据库默认值。
要找出数据库表和列名,可以使用类似这样的东西(此代码未经测试)
import org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsDomainBinder
import org.codehaus.groovy.grails.orm.hibernate.cfg.Mapping
import org.codehaus.groovy.grails.commons.DomainClassArtefactHandler
def gdc=grailsApplication.getArtefact(DomainClassArtefactHandler.TYPE, someInstance.class.name)
Mapping mapping=GrailsDomainBinder.getMapping(gdc)
def tableName=mapping.tableName
def columnName=mapping.getPropertyConfig('someColumn').column
这不是一个完整的答案,但我希望这会有所帮助。