Grails域列到等号

时间:2015-03-23 03:56:04

标签: grails gorm

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

//Domain class
class myData {
  Integer columnToEqualID

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

1 个答案:

答案 0 :(得分:2)

一种不是万无一失的方法,但如果你小心谨慎,那就是覆盖id的设定者。

这依赖于以下事实:当您声明类似columnToEqualID的持久性时,Groovy会将其转换为私有字段并添加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的价值,因此,如果您小心谨慎,那么这就是"" bit - 您和其他开发人员需要确保了解这种非标准行为。

你可以通过覆盖columnToEqualID的setter来解决这个问题,例如。

void setColumnToEqualID(Integer value) {
   if (value != id) {
      // handle the problem
   }
   this.columnToEqualID = value
}