2017-03-16 86 views
0

在Grails中,我想要一個具有前綴並自動增量的ID。自動增量分配的ID

我會有這些前綴:AB

然後我將具有如下序列:

new MyObject('A').save() ---> ID = A-1

new MyObject('A').save() ---> ID = A-2

new MyObject('B').save() ---> ID = A-3

等等......是否有可能將assigned發生器與auto-increment結合?

+0

有什麼潛在的DB? –

+0

@mikew,它是MySQL。 – zatziky

+1

您是否有像MySQL這樣的MySQL序列的概念? https://docs.oracle.com/cd/B28359_01/server.111/b28310/views002.htm#ADMIN11792您可以將域策略設置爲分配,在保存前從序列中提取值並將字母加前綴,然後保存 –

回答

0

只需將主鍵保留爲整數並添加一個getter方法來派生A1,B1值。混淆像你提議的主鍵不是一個好主意。

+0

thx,但我們需要一個描述性的ID。目前我們有'{A | B} - {randomGeneratedLong()}'。 – zatziky

+0

這不是主鍵的工作。主鍵用於唯一標識數據庫行。如果有的話,你想要的是一個複合鍵,但GORM不鼓勵它們。 更多[here](http://stackoverflow.com/a/7383118/511250)。 –

1

答案是Oracle特定的,但給出了一般想法。

創建數據庫序列:

create sequence MY_SEQ minvalue 1 maxvalue 9999999 start with 1 increment by 1; 

然後用Grails:

class MyService { 

    def dataSource 

    def save(params) { 
     def myDom = new MyDomain(params) 
     myDom.id = generateId() 
     myDom.save() 
    } 

    def generateId() { 
     def db 
     try { 
      db = Sql.newInstance(dataSource) 
     "A-${db.firstRow('SELECT MY_SEQ.NEXTVAL NEXT_ID FROM DUAL').NEXT_ID}" 
     } 
     finally { 
      db?.close() 
     } 
    } 
}