Cassandra 在保存 java.util.UUID 时说 "InvalidQueryException: Invalid version for TimeUUID type"

Cassandra says "InvalidQueryException: Invalid version for TimeUUID type" when saving java.util.UUID

我正在尝试将 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.");
    }

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

  1. You should insert the timeuuid generated via datastax driver. In your case , since you are using version 1 timeuuid, you must use UUIDs.timeBased() .

来源:

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