当我定义域对象时:
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-creation脚本自己创建表?
注意我的问题与How to set up an insert to a grails created file with next sequence number?类似,但我特意寻找的解决方案不会污染我的客户端代码。
答案 0 :(得分:1)
我会用:
static mapping = {
id generator: 'native', params:[sequence:'your_seq']
}
此外,我将通过
更新id列的DEFAULT-ValueALTER TABLE your_table ALTER COLUMN id SET DEFAULT nextval('your_seq');
这对手动INSERT非常有用
更新 - 使用liquibase作为默认列问题:
changeSet(author:'Bosh', id:'your_table_seq_defaults', failOnError: true) {
sql ("ALTER TABLE your_table ALTER COLUMN id SET DEFAULT nextval('your_seq')")
}
答案 1 :(得分: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,...
用于postgresql。
答案 2 :(得分:0)
我倾向于直接在PostgreSQL中创建我的表,然后用grails映射它们。
我最好的想法来自这里的序列生成ID:
http://blog.wolfman.com/articles/2009/11/11/using-postgresql-with-grails
试一试,然后对你以前的问题微笑:)
拉维
答案 3 :(得分:-2)
您可以在Config.groovy
中定义它grails.gorm.default.mapping = {
id generator: 'sequence'
}