UUID 作为 5.1.2 中 Grails 域 class 的 id 列

UUID as id column for a Grails domain class in 5.1.2

几个消息来源说

import java.util.UUID

class User {

    String id = UUID.randomUUID().toString()

    static mapping = {
        id generator:'assigned'
    }
}

应该生成 UUID 而不是可猜测的数字作为域对象的 ID。 它基本有效,但显示视图将被破坏:系统无法通过给定的 UUID 找到对象 - 至少在 Grails 5.1.2 中是这样。

我也尝试了 id generator: 'uuid2'id generator: 'uuid2',但情况只会越来越糟。

知道哪里出了问题吗?

因此,Jeff 在评论中提出的解决方案(谢谢!)如下:

在您的域 class 中,将 id 定义为 String 并将其设置为 assigned:

class User {

    String id

    static mapping = {
        id generator:'assigned'
    }
}

不是直接设置 id 属性,而是创建一个 Listener 并在需要时设置 id

// src/main/groovy/mypackage/UUIDListener.groovy

package mypackage

import grails.events.annotation.gorm.Listener
import org.grails.datastore.mapping.engine.event.ValidationEvent

class UUIDListener {

    @Listener(User)
    void preInsertEvent(ValidationEvent event) {
        if (event.entityObject.id == null)
            event.entityAccess.setProperty('id', UUID.randomUUID().toString())
    }
}

为了获取Listener,在grails-app/conf/spring/resources.groovy中配置它:

import mypackage.UUIDListener

// Place your Spring DSL code here
beans = {
    uuidListener UUIDListener
}

最后但同样重要的是,旧的 idLong 类型,新的是 String 类型。控制器方法具有为操作参数定义的类型。将它从 def show(Long id) { ... 更改为 def show(String id) { ...,你应该准备好了:-)