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
}
最后但同样重要的是,旧的 id
是 Long
类型,新的是 String
类型。控制器方法具有为操作参数定义的类型。将它从 def show(Long id) { ...
更改为 def show(String id) { ...
,你应该准备好了:-)
几个消息来源说
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
}
最后但同样重要的是,旧的 id
是 Long
类型,新的是 String
类型。控制器方法具有为操作参数定义的类型。将它从 def show(Long id) { ...
更改为 def show(String id) { ...
,你应该准备好了:-)