2017-08-16 47 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 

最後,這是一個非常糟糕的想法 - 除非你有一個很好的理由。