0

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

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

对比

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

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

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'
    }
 }

在此先感谢您的帮助。

4

2 回答 2

1

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

其次,你不应该依赖tablefor next 的值id,因为它不能保证是正确的——你可能会遇到id不是唯一的错误。

第三,你没有增加id,这样你最终会得到相同的,最有可能的0,每次。

这是你可以做的,使用数据库sequence——取决于数据库。

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

最后,这是一个非常糟糕的主意——除非你有一个很好的理由。

于 2017-08-16T08:49:07.263 回答
1

如果未分配,有没有办法使用已分配和回退到序列?

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

于 2017-08-16T02:43:06.873 回答