代码之家  ›  专栏  ›  技术社区  ›  user3240644

Grails域列等于ID

  •  0
  • user3240644  · 技术社区  · 10 年前

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

    //Domain class
    class myData {
      Integer columnToEqualID
    
      static mapping = {
        columnToEqualID = id //how to I get something similar to this to work?
      }
    }
    
    1 回复  |  直到 10 年前
        1
  •  2
  •   Burt Beckwith    10 年前

    一种不是万无一失的方法,但如果你小心的话,它应该是有效的,那就是重写setter id .

    这取决于这样一个事实,即当您声明一个持久类 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
    }
    

    这不会阻止您更改 列到相等ID 尽管是独立的,所以这是“如果你小心”的一点-你和其他开发人员需要确保意识到这种非标准行为。

    您可能可以通过重写 列到相等ID 也可以,例如。

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