Grails:id 生成器使用已分配并在未分配时回退到序列

Grails : id generator using assigned and falling back to sequence if unassigned

我正在使用 Grails 3.2.8。我想在生成 id 时允许这两个选项。如果未分配,有没有办法使用已分配并回退到序列?我尝试在构造函数中获取下一个 id 并在那里设置 id 但 运行 成为问题。任何 help/guidance 将不胜感激。

class Foo {
  static mapping = {
    id generator:'assigned'
  }
}

class Foo {
  static mapping = {
    id generator:'sequence'
  }
}

我试过使用映射设置为 assigned 并在 beforeValidate 函数的域构造函数中设置 id。两者都不为我工作。示例如下。

class Foo{
    Foo(){          
        def id = Foo.find("from Foo order by id desc")
        id = id ? id : 0
        this.id = id
    }
    static mapping = {
        id generator:'assigned'
    }
}

class Foo{
    def beforeValidate() {
        def id = Foo.find("from Foo order by id desc")
        id = id ? id : 0
        this.id = id
    }
    static mapping = {
        id generator:'assigned'
    }
 }

在此先感谢您的帮助。

Is there a way to use assigned and falling back to sequence if unassigned?

不,反正不是直接的。您可以使用 assigned 并且当您想要返回序列时,您可以向数据库发送查询以检索下一个序列值,然后自己分配它。我认为这可能是您可能得到的最接近的结果。

首先,你需要了解HQL;在您的示例中,您返回的是 Foo 而不是 id,因此这显然是错误的。

其次,您不应该依赖 table 来获取 id 的下一个值,因为不能保证它是正确的——您可能会遇到 id 不是唯一的有点错误。

第三,你没有递增 id,这样你每次都会得到相同的结果,很可能 0

这是您可以执行的操作,使用数据库 sequence -- 取决于数据库。

"select id_seq.nextval from dual" // for Oracle

最后,这是一个非常糟糕的主意 -- 除非您有充分的理由。