Grails использует UUID в качестве идентификатора и сопоставления с двоичным столбцом - PullRequest
8 голосов
/ 26 февраля 2011

Я хочу использовать UUID для идентификатора для моих объектов домена.Идея состоит в том, что UUID может быть предоставлен клиентом, и если не UUID будет сгенерирован.У меня есть такое определение:База данных MySQL.А также на поиск имеют правильный формат для отправки обратно.

Как мне это сделать?Мысли о лучшем способе сделать это?

1 Ответ

3 голосов
/ 27 февраля 2011

Grails и Hibernate обычно обрабатывают UUID в форме строки. Использование бинарных UUID возможно с небольшой работой. Объявите id типа UUID и укажите пользовательский тип гибернации, чтобы сериализовать его как массив байтов. Вам также нужно указать Grails, какой тип SQL использовать для UUID. Например:

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))
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...