通常,当我向域对象添加辅助方法时,在编译时会出现错误,解析为“未找到 x 属性”。这似乎发生在方法名称getX
,setX
和最近isX
。是否有我应该避免的姓名形式列表?有没有办法注释或以其他方式标记这些方法,以便 Grails 不会将它们与自动属性混淆?
问问题
615 次
3 回答
7
Grails 自动检测属性并假定它们是持久的。Groovy 中的公共字段在底层创建了一个 getter 和 setter,因此假定 getter 与持久字段相关联。
但是,如果您想要一个以 'get' 或 'is' 开头但不是持久性字段的 getter 的辅助方法,您有两种选择。一种是使用transients
列表 - 参见http://grails.org/doc/latest/ref/Domain%20Classes/transients.html
另一种选择是将返回值声明为def
. 由于它没有类型化(def 是 Object 的别名),Hibernate 无法持久化它,因为它不知道要使用什么数据类型,所以它被忽略了。
我的首选是transients
列表,因为我宁愿使用自记录方法,在这些方法中,它们的作用、它们接受的参数类型和返回的内容都一目了然。
于 2011-02-20T17:03:09.877 回答
0
我不知道通用列表 - 它太多样化了。Groovy 和 Grails 的不同部分添加了约定方法:
- 关于属性 getter/setter 的 Groovy 约定是非常基本的东西。不可能有一个
getX()
方法并且没有对x
属性的读取权限。 - Grails 域类动态方法和域类约定属性是特定于 Grails 域类的;
- 与控制器相同,依此类推;
- 关于属性 getter/setter 的 Groovy 约定,包括
methodMissing
、propertyMissing
、$staticMethodMissing
、getProperty
等properties
; - Groovy 添加了许多
as<Type>()
方法,例如asInteger()
; - 不同的插件可以注入更多的约定方法。
要访问声明的字段,而不是 getter/setter,请使用java field access operator。
于 2011-02-20T15:11:22.073 回答
0
据我了解您的问题,您可以使用瞬态!
static transients = ['feildName']
于 2012-02-23T10:34:10.420 回答