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
最后,这是一个非常糟糕的主意 -- 除非您有充分的理由。
我正在使用 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
最后,这是一个非常糟糕的主意 -- 除非您有充分的理由。