【问题标题】:What's the best way to define custom id generation as default in Grails?在 Grails 中将自定义 id 生成定义为默认值的最佳方法是什么?
【发布时间】:2011-05-14 16:05:12
【问题描述】:

我想切换我的域类以使用可变长度的 UUID 作为其 ID。我不想简单地在 URL 上显示顺序 id 以供人们尝试和弄乱。我编写了 Java UUID 方法的自定义版本以允许可变长度,因此我可以为不会变大的模型设置更短的 id。

我发现这个线程解释了如何修改默认映射,以便我可以更改为“已分配”。 Modify Id generation for a Grails Plugin

同时配置默认 beforeInsert(生成自定义 UUID)并告诉 Grails 我想使用字符串作为 id 而不是整数的最佳方法是什么?

我尝试将 grails.gorm.default.beforeInsert 添加到配置中,但没有奏效。

【问题讨论】:

  • ataylor 在下面的回答是在 grails 中执行此操作的正确方法,但我通常会单独保留数据库生成的 ID,并在需要某种相关 ID 的对象上添加不同的字符串/GUID 字段这可能会暴露给最终用户。这样,您就可以获得 grails/hibernate 和数据库已针对的正常连接/外键行为(并且编写 SQL 更容易),但是当您需要该外部 ID 时,您也可以使用它。
  • 这就是我之前所做的,但我读到你会以这种方式丢失默认缓存,因为它是通过 id 完成的。而且由于我尽量不对数据库做任何事情(或者我们有备用键),所以我会试一试。

标签: grails grails-orm


【解决方案1】:

要让 grails 使用字符串作为 id,只需声明一个属性 String id。要使用自定义 UUID 填充它,我将使用休眠 id 生成器而不是 beforeInsert。创建一个扩展 org.hibernate.id.IdentifierGenerator 的类,然后将这样的 id 生成器映射添加到您的域类:

class MyIdGenerator extends IdentifierGenerator {
    Serializable generate(SessionImplementor session, Object object) {
        return MyUUID.generate()
    }
}

class MyDomain {
    String id
    static mapping = {
        id generator:"my.package.MyIdGenerator", column:"id", unique:"true"
    }
}

【讨论】:

    【解决方案2】:

    这个问题很老,但它仍然出现在搜索中。这是目前最好的方法,大约是 Grails 2.3。 (我使用的是 postgres,所以请注意“pg-uuid”类型。根据您的特定数据存储调整它)。

    UUID uuid    
    static mapping = {
        uuid generator: 'uuid2', type: 'pg-uuid'
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 2015-12-11
      • 1970-01-01
      • 1970-01-01
      • 2018-07-15
      • 1970-01-01
      • 2011-05-14
      • 2014-02-28
      • 2022-07-03
      • 1970-01-01
      相关资源
      最近更新 更多