2017-03-14 56 views
3

我試圖將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"Cassandra在保存java.util.UUID時說「InvalidQueryException:TimeUUID類型的無效版本」

學習代碼在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

這意味着,卡桑德拉timeuuid型只接受基於時間的UUID。由java.util.UUID#randomUUID()生成的值是類型4(僞隨機生成的)UUID,並且不通過驗證。 因此,TimeUUID類按預期工作,但異常原因並不明顯。 可能的解決方法:

  1. 你應該通過插入驅動datastax產生的timeuuid。在你的情況下,因爲你正在使用版本1 timeuuid,你必須使用UUIDs.timeBased()

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

  • 或者如果通過彈簧數據卡桑德拉映射實體和需要保存由第三方提供的UUID,添加到實體字段的註釋@CassandraType(type = DataType.Name.UUID)