首页 文章

保存java.util.UUID时,Cassandra说“InvalidQueryException:TimeUUID类型的版本无效”

提问于
浏览
4

我正在尝试将 java.util.UUID 保存到 timeuuid 类型的Cassandra列 . 例如,这是一个默认的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.");
    }

1 回答

  • 6

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

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

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

    • 或者,如果您通过spring-data-cassandra映射实体并需要保存第三方提供的UUID,请向实体字段添加注释 @CassandraType(type = DataType.Name.UUID)

相关问题