如何更改Grails域类ID字段的名称?

时间:2013-07-24 14:48:24

标签: grails orm gorm hibernate-mapping grails-domain-class

我有一个名为FundType的Grails 2.2.3域类,我试图将其映射到旧数据库表。它有两个字段:codedescription。我希望id在我使用域类的时候被调用code,最好是在任何生成的脚手架上。但每次我在id上使用名称密钥时,我都会遇到此异常:

| Error 2013-07-24 09:38:44,855 [localhost-startStop-1] ERROR context.GrailsContextLoader  - Error initializing the application: Error evaluating ORM mappings block for domain [com.company.scholallow.FundType]:  null
Message: Error evaluating ORM mappings block for domain [com.company.scholallow.FundType]:  null

这是我的域类包含的内容:

class FundType {

    String id
    String description

    static mapping = {
        id column: 'fund_code', generator: 'assigned', name: 'code'
        description column: 'fund_desc'
    }
}

每当我使用FundType实例时,我想调用fundTypeInstance.code和NOT fundTypeInstance.id之类的代码。这将使我对用户更友好,因为我正在处理一些叫做代码的东西,而不是id。

所以我想知道我想做的事情是什么?我在我的域类中做错了什么导致了这个ORM映射错误?

修改

好的,所以我将我的域类更改为以下内容,并且我找不到ID为null null的FundType。

class FundType {

    String code
    String description

    static mapping = {
        id generator: 'assigned', name: 'code'
        code column: 'fund_code'
        description column: 'fund_desc'
    }
}

我添加了一些sql日志记录来查看Hibernate正在做什么,这就是输出:select * from ( select this_.FUND_CODE as RTVFTYP1_1_0_, this_.FUND_DESC as RTVFTYP2_1_0_ from RTVFTYP this_ ) where rownum <= ?

2 个答案:

答案 0 :(得分:6)

在域类中使用String code而不是String id

您有意向GORM提及我要使用属性code,该属性映射到表格列fund_code,其值被指定为id(主键)。在这种情况下,您只需要在域类中定义属性code而不是id

答案 1 :(得分:0)

(我正在回答有助于我将来使用的其他程序员使用的修复程序)

@dmahapatro是对的,我需要添加String code

看起来命名id不同的东西只是与Grails动态脚手架不能很好地匹配。我做了一些测试,我仍然可以使用FundType.get(code),它将返回对象,就像我传入一个id一样。我也可以FundType.findByCode(code)

看起来我必须更改脚手架控制器以期望String id而不是默认的Long id。我还必须更改scaffolded list视图以将fundTypeInstance.code而不是fundTypeInstance.id发送到show controller,但我怀疑添加一个只返回this.code的getId()将解决这个问题。