【问题标题】:grails/hibernate: how to disable auto-increment on ID column?grails/hibernate:如何禁用 ID 列的自动增量?
【发布时间】:2015-01-08 11:11:30
【问题描述】:

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

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

我还想要其他好处,例如能够在内存中创建具有正确 ID 的对象,而无需从数据库中读取它,然后将此对象与另一个对象建立“包含”类型关系,如果这有意义的话。

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

http://grails.org/doc/2.1.0/ref/Database%20Mapping/id.html

【问题讨论】:

    标签: hibernate grails grails-orm


    【解决方案1】:

    查看列的映射。根据documentation,您可以像这样使用assigned

    static mapping = {
        id generator: 'assigned'
    }
    

    根据休眠文档assigned 的行为如下:

    让应用程序在 save() 之前为对象分配一个标识符 叫做。如果没有元素,这是默认策略 指定。

    【讨论】:

    • 遗憾的是,这似乎不起作用。如果我尝试它,并将一个 id 传递给构造函数并保存它,我得到: IdentifierGenerationException: 此类的 ids 必须在调用 save() 之前手动分配
    • @JohnLittle 那么为什么不在调用 save 之前手动分配呢?
    • 我希望在构造函数中传入 id,例如新状态(id:1,名称:“活动”).save()。我看到我可以这样做: s=new Status(name:"active"); s.id = 1, s.save(),这更痛苦,因为我在引导程序中有很多静态项目要设置。我查看了重写 Status 构造函数,传入 _id 并手动分配它以及所有其他字段,但这也是很大的开销。
    • 默认情况下,id 属性不是“可绑定的”,即在使用 map 构造函数和批量设置属性时(例如 foo.properties = params)会忽略它。在构造函数调用之后显式设置它,或者使id 属性可与bindable constraint 绑定。请注意,使属性可绑定 this 有点不安全; idversion 被 Grails 自动排除(除了 Groovy 添加的默认 classmetaClass 排除),因为只有 Hibernate 应该设置或更新这些值。
    猜你喜欢
    • 1970-01-01
    • 2013-04-27
    • 2017-04-27
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 2011-09-13
    相关资源
    最近更新 更多