Grails 域列等于 ID
Grails Domain Column to Equal ID
如何自动填充域中的自定义列 class 以等于 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 and/or setter 而 Groovy 不会添加默认版本,所以您可以为要设置的内容添加逻辑 and/or 要获取的内容。
Grails 为您添加了一个 Long id
属性,因此在每个域 class 中都有一个 getId
和 setId
方法,您可以添加您的拥有与默认行为相同的行为,以及自定义行为。
所以这应该可以满足您的要求:
void setId(Long id) {
this.id = id
columnToEqualID = id
}
不过,这不会阻止您独立更改 columnToEqualID
的值,所以这是 "if you're careful" 位 - 您和其他开发人员需要确保了解这种非标准行为.
您也可以通过覆盖 columnToEqualID
的 setter 来解决该问题,例如
void setColumnToEqualID(Integer value) {
if (value != id) {
// handle the problem
}
this.columnToEqualID = value
}
如何自动填充域中的自定义列 class 以等于 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 and/or setter 而 Groovy 不会添加默认版本,所以您可以为要设置的内容添加逻辑 and/or 要获取的内容。
Grails 为您添加了一个 Long id
属性,因此在每个域 class 中都有一个 getId
和 setId
方法,您可以添加您的拥有与默认行为相同的行为,以及自定义行为。
所以这应该可以满足您的要求:
void setId(Long id) {
this.id = id
columnToEqualID = id
}
不过,这不会阻止您独立更改 columnToEqualID
的值,所以这是 "if you're careful" 位 - 您和其他开发人员需要确保了解这种非标准行为.
您也可以通过覆盖 columnToEqualID
的 setter 来解决该问题,例如
void setColumnToEqualID(Integer value) {
if (value != id) {
// handle the problem
}
this.columnToEqualID = value
}