簡體   English   中英

保存java.util.UUID時,Cassandra說“InvalidQueryException:TimeUUID類型的版本無效”

[英]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()生成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類按預期工作,但異常原因並不那么明顯。 可能的解決方法:

  1. 您應該插入通過datastax驅動程序生成的timeuuid。 在您的情況下,由於您使用的是版本1 timeuuid,因此必須使用UUIDs.timeBased()

資料來源: https//stackoverflow.com/a/23198388

  1. 或者,如果您通過spring-data-cassandra映射實體並需要保存第三方提供的UUID,則向實體字段添加注釋@CassandraType(type = DataType.Name.UUID)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM