grails/hibernate:如何禁用ID列上的自动增量?

grails/hibernate:如何禁用ID列上的自动增量?,hibernate,grails,gorm,Hibernate,Grails,Gorm,默认情况下,当您在grails中创建域对象时,它会添加“id”列,并在DB中将其设置为自动递增 我希望在创建/保存对象时提供id参数,而不是使用任何类型的generate(它用于少量静态数据,我希望id固定为我给定的值) 我还希望获得其他好处,例如,能够在内存中创建具有正确ID的对象,而不必从DB读取该对象,然后使该对象与另一个对象建立“包含”类型的关系(如果有意义的话) Grails为id列提供了文档,但没有说明如何禁用自动增量并允许将id传递到域对象构造函数: 查看列的映射。根据,您可以使用

默认情况下,当您在grails中创建域对象时,它会添加“id”列,并在DB中将其设置为自动递增

我希望在创建/保存对象时提供id参数,而不是使用任何类型的generate(它用于少量静态数据,我希望id固定为我给定的值)

我还希望获得其他好处,例如,能够在内存中创建具有正确ID的对象,而不必从DB读取该对象,然后使该对象与另一个对象建立“包含”类型的关系(如果有意义的话)

Grails为id列提供了文档,但没有说明如何禁用自动增量并允许将id传递到域对象构造函数:


查看列的映射。根据,您可以使用
分配的
,如下所示:

static mapping = {
    id generator: 'assigned'
}
根据hibernate文档
分配的
行为如下:

允许应用程序在保存()之前为对象分配标识符 被称为。如果未指定任何元素,则这是默认策略 指定的


遗憾的是,这似乎不起作用。如果我尝试,并将id传递给构造函数并保存它,我会得到:IdentifierGenerationException:在调用save()@JohnLittle之前必须手动分配此类的id,那么为什么不在调用save()之前手动分配它呢?我希望在构造函数中传递id,例如新状态(id:1,名称:“active”).save()。我知道我可以这样做:s=新状态(名称:“活动”);s、 id=1,s.save(),这更痛苦,因为我有很多静态项要在引导中设置。我考虑过重写状态构造函数,传入并分配_id,以及手动分配所有其他字段,但这也是一项巨大的开销。默认情况下,
id
属性是不“可绑定的”,即使用映射构造函数以及批量设置属性(例如
foo.properties=params
)时忽略它。在构造函数调用之后显式设置它,或者使
id
属性可与绑定。请注意,使属性可绑定这有点不安全id
版本
(除了Groovy添加的默认
元类
排除之外),因为只有Hibernate应该设置或更新这些值。