Grails域列的ID相等
如何在域类中自动填充自定义列以使其等于ID?例如:Grails域列的ID相等,grails,gorm,Grails,Gorm,如何在域类中自动填充自定义列以使其等于ID?例如: //Domain class class myData { Integer columnToEqualID static mapping = { columnToEqualID = id //how to I get something similar to this to work? } } 有一种方法不是万无一失的,但如果小心的话,它应该可以工作,那就是覆盖id的setter 这取决于这样一个事实:当您声明一个持久性
//Domain class
class myData {
Integer columnToEqualID
static mapping = {
columnToEqualID = id //how to I get something similar to this to work?
}
}
有一种方法不是万无一失的,但如果小心的话,它应该可以工作,那就是覆盖
id
的setter
这取决于这样一个事实:当您声明一个持久性字段(如columnToEqualID
)时,Groovy会将其转换为一个私有字段并添加一个getter和setter方法(但前提是您不使用任何范围修饰符,因此如果您包括private
、public
等,那么它将保持您声明的状态)。因此,Integer columnToEqualID
基本上变成
private Integer columnToEqualID
public void setColumnToEqualID(Integer value) {
columnToEqualID = value
}
public Integer getColumnToEqualID() {
return columnToEqualID
}
这不是Groovy运行时元编程的神奇之处——它实际上是在字节码中,因此,如果您反编译.class文件,您可以看到所有这些
这很酷,因为您可以随时添加自己的getter和/或setter,Groovy不会添加默认版本,因此您可以为设置什么和/或获取什么添加逻辑
Grails为您添加了一个Long id
属性,因此在每个域类中都有一个getId
和setId
方法,您可以添加自己的方法,该方法与默认方法相同,还可以添加自定义行为
所以这应该是你想要的:
void setId(Long id) {
this.id = id
columnToEqualID = id
}
但是,这不会阻止您独立更改columnToEqualID
的值,因此这是“如果您很小心”的一点-您和其他开发人员需要确保意识到这种非标准行为
您可能也可以通过覆盖columnToEqualID
的setter来解决这个问题,例如
void setColumnToEqualID(Integer value) {
if (value != id) {
// handle the problem
}
this.columnToEqualID = value
}