2017-08-16 13 views
0

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

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

VS

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

在此先感谢您的帮助。

回答

1

是否有使用分配的方式,并回落至若 未分配的顺序?

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

+0

更新了问题。如果可能的话,你能否举个例子。我试过使用构造函数和'beforeValidate'函数。我也尝试过使用'beforeInsert',在使用其中任何一个时遇到问题。谢谢你的时间布朗先生。 – mcroteau

+0

你已经改变了你的问题,现在是一个完全不同的问题。 –

1

首先,您需要了解HQL;在你的例子中,你正在返回Foo而不是id,所以这显然是错误的。第二,你不应该依赖table下一个值id,因为它不能保证是正确的 - 你可能会面临id不是唯一的有点错误。

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

以下是您可以做的事,使用数据库sequence - 取决于数据库。

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

最后,这是一个非常糟糕的想法 - 除非你有一个很好的理由。