Grails域列的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 这取决于这样一个事实:当您声明一个持久性

如何在域类中自动填充自定义列以使其等于ID?例如:

//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
}