2017-03-14 3 views
3

J'essaie d'enregistrer java.util.UUID à la colonne Cassandra de type timeuuid. Par exemple, il s'agit d'une correspondance par défaut de spring-data-cassandra: http://docs.spring.io/spring-data/cassandra/docs/current/reference/html/#mapping-conversion. Valeur de UUID est généré par java.util.UUID#randomUUID() je reçois une exception: "com.datastax.driver.core.exceptions.InvalidQueryException: Invalid version for TimeUUID type"Cassandra dit "InvalidQueryException: Version invalide pour le type TimeUUID" lors de la sauvegarde de java.util.UUID

L'étude du code à https://svn.apache.org/repos/asf/cassandra/trunk/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java révèle la raison:

@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."); 
    } 

Répondre

4

Cela signifie que le type Cassandra timeuuid accepte uniquement UUID en fonction du temps. La valeur qui est générée par java.util.UUID # randomUUID() est un UUID de type 4 (pseudo-généré aléatoirement) et ne réussit pas la validation. La classe TimeUUID fonctionne donc comme prévu, mais la cause de l'exception n'est pas si évidente. solutions de contournement possibles:

  1. Vous devez insérer le timeuuid généré par DataStax conducteur. Dans votre cas, puisque vous utilisez timeuuid version 1, vous devez utiliser UUIDs.timeBased().

Source: https://stackoverflow.com/a/23198388

  1. Ou si vous êtes entité mappez par ressort données cassandra et doivent enregistrer UUID fournis par des tiers, ajouter champ d'entité l'annotation @CassandraType(type = DataType.Name.UUID)