2010-04-06 59 views
6

是否有可能創建一個沒有'id'的表?例如,這是我的域名:Grails域名可能沒有'id'嗎?

class SnbrActVector { 

    int nid 
    String term 
    double weight 

    static mapping = { 
     version false 
     id generator: 'identity' 
    } 

    static constraints = { 
    } 
} 

當我運行該SQL語句,它失敗:

insert into snbr_act_vector values (5, 'term', 0.5) 

我檢查表和「ID」已被設置爲自動增量。我在想另一種選擇是刪除'id'本身。還是有另一種解決方法呢?請假定它不是更改提供的SQL語句的選項。

回答

1

嘗試使用:「id(generator:'assigned')」而不是「id generator:'identity'」並查看是否從「id」數據庫列中刪除了autoincrement屬性。

+0

感謝您的回覆。剛剛測試了你的建議,不幸的是,'身份證'仍然存在。 – firnnauriel 2010-04-06 07:27:19

+0

btw,它刪除了'id'的自動增量屬性。但我需要的是完全刪除「ID」列,並只有3列:NID,術語,重量 – firnnauriel 2010-04-06 07:29:34

4

您可能需要指定nid是您的id列。

static mapping = { 
    version false 
    id generator: 'identity', column: 'nid' 
} 
+0

看起來像這可能是另一種方法。我可能需要玩'發電機'屬性。請再次注意,主要目標是使此聲明無需修改即可使用:插入到snbr_act_vector值(5,'term',0.5) – firnnauriel 2010-04-06 07:40:27

+0

如果這確實是您的目標,那麼您可能需要做一些額外的設置在你的數據庫中。也許是將語句翻譯爲表定義的觸發器?否則,我認爲盧克的答案接近於Grails/GORM可以做的最多的答案。 – 2010-04-06 12:45:07

6

Gorm需要一個id字段才能工作。你可以使用像下面這樣的瞬態變量來僞造一個指定的id。 getters和setters將nid字段映射到id字段。

使用此方法時,你所要做的保存域對象:因爲Grails的認爲一個非空ID是一個持久化實例

snbrActVectgor.save(insert:true) 

class SnbrActVector { 
    Integer id 
    // nid is the actual primary key 
    static transients = ['nid'] 
    void setNid(Integer nid) { 
     id = nid 
    } 
    Integer getNid() { 
     return nid 
    } 

    static mapping = { 
     version false 
     id generator:'assigned', column:'nid', type:'integer' 
    } 
} 
2

沒有辦法沒有「id」。你可以做的是使用分配的ID生成器來更改「ID」字段的名稱。

0

在Oracle中可以使用ROWID作爲ID列。

class Document { 
    String id 

    static mapping = { 
     table "DOCUMENTS" 
     version false 
     id column: 'ROWID' 
    } 

}