3

我有一个名为 Grails 2.2.3 的域类FundType,我试图将其映射到旧数据库表。它有两个字段:codedescription。我希望在我使用域类的任何时候id被调用code,最好是在任何生成的脚手架上。但是每次我使用 name 键时,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.codeand NOT的代码fundTypeInstance.id。这将使它对我更加用户友好,因为我正在处理称为代码的东西,而不是 id。

所以我想知道我想做的事情可能吗?我在导致此 ORM 映射错误的域类中做错了什么?

编辑:

好的,所以我将我的域类更改为以下,我得到一个 FundType not found with ID null 错误。

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 <= ?

4

2 回答 2

7

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

您故意向 GORM 提及我想使用映射到其值被分配为(主键)的code表列的属性。在这种情况下,您只需要在域类中定义属性而不是.fund_codeidcodeid

于 2013-07-24T15:05:20.620 回答
0

(我正在回答对我有用的修复程序,以供其他程序员将来使用)

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

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

看起来我必须更改脚手架控制器以期望 String id 而不是默认的 Long id。我还必须更改脚手架列表视图以发送fundTypeInstance.code而不是发送fundTypeInstance.id到显示控制器,但我怀疑添加仅返回 this.code 的 getId() 将解决该问题。

于 2013-07-24T16:29:56.237 回答