gpt4 book ai didi

mysql - grails 使用 uuid 作为 id 并映射到二进制列

转载 作者:可可西里 更新时间:2023-11-01 06:33:49 24 4
gpt4 key购买 nike

我想使用 UUID 作为我的域对象的 ID。这个想法是 uuid 可以由客户端提供,如果不是,将生成一个 UUID。我的定义是这样的: :

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

String id

def getUUID ={
return java.util.UUID.randomUUID().toString();
}


transient beforeInsert = {
if ( id == null || id.equals(""))
id = getUUID();
}
}

现在假设我去掉了包含在 java UUID 或客户端提供的 UUID 中的破折号,我希望将其存储在我的 MySQL 数据库的二进制字段中。并且在检索时也有正确的格式发回。

我怎样才能做到这一点?有没有更好的方法来做到这一点?

最佳答案

Grails 和 hibernate 通常以字符串形式处理 UUID。使用二进制 UUID 可能需要做更多的工作。将 id 声明为 UUID 类型,并提供休眠用户类型以将其序列化为字节数组。您还需要告诉 grails UUID 使用什么 SQL 类型。例如:

class Person {
static mapping = {
id generator:'assigned', type: UUIDUserType, sqlType: 'varbinary(16)'
}

UUID id

def beforeInsert = {
if (!id) {
id = UUID.randomUUID()
}
}
}

UUID 的用户类型是:

import java.nio.ByteBuffer
import java.nio.LongBuffer
import java.sql.ResultSet
import java.sql.PreparedStatement
import java.sql.Types
import org.hibernate.usertype.UserType

public class UUIDUserType implements UserType {

int[] sqlTypes() { [Types.VARBINARY] as int [] }
Class returnedClass() { UUID }

Object nullSafeGet(ResultSet resultSet, String[] names, owner) {
byte[] value = resultSet.getBytes(names[0])
return value ? bytesToUuid(value) : null
}

void nullSafeSet(PreparedStatement statement, value, int index) {
if (value == null) {
statement.setNull(index, Types.VARBINARY)
} else {
statement.setBytes(index, uuidToBytes(value))
}
}

boolean equals(x, y) { x == y }
int hashCode(x) { x.hashCode() }
Object deepCopy(value) { value }
boolean isMutable() { false }
Serializable disassemble(value) { value }
Object assemble(Serializable cached, owner) { cached }
def replace(original, target, owner) { original }

static byte[] uuidToBytes(uuid) {
def bytes = new byte[16];
ByteBuffer.wrap(bytes).asLongBuffer().with {
put(0, uuid.mostSignificantBits)
put(1, uuid.leastSignificantBits)
}
bytes
}

static UUID bytesToUuid(bytes) {
ByteBuffer.wrap(bytes).asLongBuffer().with {
new UUID(get(0), get(1))
}
}
}

关于mysql - grails 使用 uuid 作为 id 并映射到二进制列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5129236/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com