5

例如,假设我想让该列设置为数据库默认设置的任何内容,而不在域类中重新定义该默认设置?

我通过谷歌找不到太多东西。有迹象表明,如果我直接使用 Hibernate,我可以将该特定列/属性设置为私有,这可能会完成我所寻求的。

我当然可以不定义该列,GORM 会忽略它。但是每当 Grails 应用程序进行选择时,我都需要其中的值。

4

2 回答 2

3

您可以像在doc中一样使用 GORM 可插入属性,也可以通过事件读取值beforeInsert

class Book {
    String title
    String isbn

    static mapping = {
        isbn nullable: false
    }

    def beforeInsert {
        title = queryFromDatabase...
    }
}
于 2012-09-17T21:49:24.737 回答
1

我认为您必须使用 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

这不是一个完整的答案,但我希望这会有所帮助。

于 2012-09-18T03:15:43.877 回答