为什么域类中的get-Property仅可用于Set和findAll?

sku*_*urt 0 dns grails

Domain课堂上FooReward我添加了一个方法

int getQuantity() {
  FooRewardAssignment.countByReward(this)
}
Run Code Online (Sandbox Code Playgroud)

在GSP中的用法应该是fooRewardInstance.quantity,但是在启动时(在引导程序中)的错误,其中包含没有找到setter方法的消息.

如果我改成它

Set<FooRewardAssignment> getListOfFoos() {
    FooRewardAssignment.findAllByReward(this)
}
Run Code Online (Sandbox Code Playgroud)

并且更改GSP中的用法badeRewardInstance.listOfFoos.size(),它可以工作并向我显示特殊FooReward分配的频率.

知道版本1有什么问题吗?

Krz*_*hel 5

解决此问题的两种解决方法:

  1. 将返回值更改为def:

    def getQuantity() {    
       FooRewardAssignment.countByReward(this) 
    }
    Run Code Online (Sandbox Code Playgroud)
  2. 或者通过添加瞬态列表:

    static transients = ['quantity'] 
    int getQuantity() {
       FooRewardAssignment.countByReward(this) 
    }

有时GORM基于域类中的setter和getters方法在tabel中创建列.在这种情况下,GORM希望添加像'quantity'这样的列,但是会发生错误,因为GORM只能看到getter,而且看不到setter.所以我们可以说我们不想在数据库中创建这个列(静态瞬态),或者我们可以将返回值设置为def - 但是不要问我为什么GORM没有考虑'def getters';)

  • 'def'getter被忽略,因为Hibernate需要知道Java类型才能知道要使用的数据库类型.所以Grails忽略'def'getter,因为def是Object的别名.我的偏好是强烈地键入它并添加到瞬态,因为它更自我记录. (2认同)