4

我正在尝试保存java.util.UUID到 Cassandra 类型的列timeuuid。例如,这是一个默认的 spring-data-cassandra 映射:http ://docs.spring.io/spring-data/cassandra/docs/current/reference/html/#mapping-conversion 。UUID 的值是由java.util.UUID#randomUUID() 我得到一个异常生成的: "com.datastax.driver.core.exceptions.InvalidQueryException: Invalid version for TimeUUID type"

在https://svn.apache.org/repos/asf/cassandra/trunk/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java研究代码揭示了原因:

    @Override
    public void validate(byte[] bytes)
    {
        if (bytes.length != 16 && bytes.length != 0)
            throw new MarshalException(String.format("TimeUUID should be 16 or 0 bytes (%d)", bytes.length));
        // version is bits 4-7 of byte 6.
        if (bytes.length > 0)
            if ((bytes[6] & 0xf0) != 0x10)
                throw new MarshalException("Invalid version for TimeUUID type.");
    }
4

1 回答 1

6

这意味着 Cassandratimeuuid类型只接受基于时间的 UUID。由 java.util.UUID#randomUUID() 生成的值是类型 4(伪随机生成)UUID,未通过验证。所以 TimeUUID 类按预期工作,但异常原因并不那么明显。可能的解决方法:

  1. 您应该插入通过 datastax 驱动程序生成的 timeuuid。在您的情况下,由于您使用的是版本 1 timeuuid,因此您必须使用 UUIDs.timeBased().

来源:https ://stackoverflow.com/a/23198388

  1. 或者,如果您通过 spring-data-cassandra 映射实体并且需要保存第三方提供的 UUID,请在实体字段中添加注释@CassandraType(type = DataType.Name.UUID)
于 2017-03-14T16:40:30.060 回答