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

//Domain class
class myData {
  Integer columnToEqualID

  static mapping = {
    columnToEqualID = id //how to I get something similar to this to work?
  }
}

最佳答案

一种方法并非万无一失,但是如果您小心的话应该可以使用,那就是覆盖id的设置方法。

这依赖于以下事实:当您声明像columnToEqualID这样的持久性时,Groovy会将其转换为私有(private)字段并添加getter和setter方法(但前提是不使用任何范围修饰符,因此,如果您包括privatepublic,等等,那么它将保持您声明的状态)。所以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属性,因此每个域类中都有一个getIdsetId方法,并且您可以添加自己的方法,该方法与默认方法相同,并附带自定义行为。

所以这应该做你想要的:
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
}

08-28 22:57