2014-05-23 30 views
2

當我定義諸如域對象:如何讓Grails/GORM在postgres中使用默認序列值?

class MusicPlayed { 

    String user 
    Date date = new Date() 
    String mood 

    static mapping = { 
    id name: 'played_id' 
    version false 
    } 

} 

我得到一個Postgres順序自動定義如下:

CREATE SEQUENCE seq_music_played 
    INCREMENT 1 
    MINVALUE 1 
    MAXVALUE 9223372036854775807 
    START 1 
    CACHE 1; 

這是偉大的 - 但我很想有這個成爲默認值我的id字段。換句話說,我希望將表格定義爲:

played_id bigint DEFAULT nextval('seq_music_played'::regclass) NOT NULL, 

...但是這不會發生。因此,當我的客戶端代碼需要手動SQL調用時,我就不能從順序中拉取新值,而不僅僅依賴於自動填充。

有沒有什麼辦法可以按照我想要的方式創建此表,還是我需要放棄gorm的表創建魔法,並且只需使用在安裝時運行的db創建腳本自己創建表,時間?


注意我的問題是類似How to set up an insert to a grails created file with next sequence number?,但我專門找不污染我的客戶端代碼的解決方案。

回答

-2

可以在Config.groovy中

grails.gorm.default.mapping = { 
    id generator: 'sequence' 
} 
+1

這沒有考慮到他的序列名'seq_music_played' – boecko

1

我會用:

static mapping = { 
    id generator: 'native', params:[sequence:'your_seq'] 
    } 

Additio應受,我會通過

ALTER TABLE your_table ALTER COLUMN id SET DEFAULT nextval('your_seq'); 

這是手動的INSERT

非常有用的更新ID列的DEFAULT-價值

更新 - 使用liquibase爲默認列問題:

changeSet(author:'Bosh', id:'your_table_seq_defaults', failOnError: true) { 
sql ("ALTER TABLE your_table ALTER COLUMN id SET DEFAULT nextval('your_seq')") 
} 
+0

爲liquibase引用+1 - 我不知道這個輕量級的語法。 – Bosh

1

這個工作對我來說:-)

static mapping = { 
    id generator: 'native', params: [sequence: 'my_seq'], defaultValue: "nextval('my_seq')" 
} 

生成類似:

create table author (
    id int8 default nextval('nsl_global_seq') not null,... 

for postgresql。

相關問題