2017-09-13 1 views
1

L'objet info-utilisateur suivant est mappé à une table "user_info" dans mon espace de clé "data_collection". J'ai créé la table "user_info" dans ma base de données cassandra. J'utilise le cassandra de données de ressort pour se relier à la base de données de cassandra de JAVA et aux annotations de ressort comme ci-dessous.erreur de colonne column non configurée pendant l'insertion

@Table(name="user_info",keyspace="data_collection", caseSensitiveKeyspace = false,caseSensitiveTable = false) 

public class UserInfo { 
    @PartitionKey 
    private UUID id; 

    @PrimaryKeyColumn 
    private String email; 

    private int phone; 

    private String name; 

    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getEmail() { 
     return email; 
    } 
    public void setEmail(String email) { 
     this.email = email; 
    } 
    public int getPhone() { 
     return phone; 
    } 
    public void setPhone(int phone) { 
     this.phone = phone; 
    } 
} 

J'utilise le code suivant pour insérer un enregistrement dans ma table "user_info".

@Autowired 
    CassandraTemplate cassandraTemplate; 

    public void saveUserInfo(UserInfo userInfo){ 
     logger.debug("userInfo "+new Gson().toJson(userInfo)); 
     String email = userInfo.getEmail(); 
     Select select = QueryBuilder.select().from("user_info"); 
     select.where(QueryBuilder.eq("email", email)); 
     logger.debug("Query "+select.toString()); 
     UserInfo existingUser = cassandraTemplate.selectOne(select, UserInfo.class); 
     if(existingUser!=null){ 
      cassandraTemplate.update(userInfo); 
     } 
     else{ 
      cassandraTemplate.insert(userInfo); 
     } 

    } 

Mon selectOne fonctionne correctement alors que pendant insert je reçois l'exception suivante. J'ai clairement mappé la classe UserInfo.java au nom de la table "user_info" en utilisant l'annotation ci-dessus. Je ne sais pas pourquoi l'insertion essaye d'arriver à la table "userinfo".

org.springframework.cassandra.support.exception.CassandraInvalidQueryException: unconfigured columnfamily userinfo; nested exception is com.datastax.driver.core.exceptions.InvalidQueryException: unconfigured columnfamily userinfo 
    at org.springframework.cassandra.support.CassandraExceptionTranslator.translateExceptionIfPossible(CassandraExceptionTranslator.java:128) 
    at org.springframework.cassandra.core.CqlTemplate.potentiallyConvertRuntimeException(CqlTemplate.java:946) 
    at org.springframework.cassandra.core.CqlTemplate.translateExceptionIfPossible(CqlTemplate.java:930) 
    at org.springframework.cassandra.core.CqlTemplate.translateExceptionIfPossible(CqlTemplate.java:912) 
    at org.springframework.cassandra.core.CqlTemplate.doExecute(CqlTemplate.java:278) 
    at org.springframework.cassandra.core.CqlTemplate.doExecute(CqlTemplate.java:559) 
    at org.springframework.cassandra.core.CqlTemplate.execute(CqlTemplate.java:1333) 
    at org.springframework.data.cassandra.core.CassandraTemplate.doUpdate(CassandraTemplate.java:895) 
    at org.springframework.data.cassandra.core.CassandraTemplate.update(CassandraTemplate.java:537) 
    at org.springframework.data.cassandra.core.CassandraTemplate.update(CassandraTemplate.java:532) 

S'il vous plaît trouverez ci-dessous la description de la table cassandra.

CREATE TABLE user_info (
    name text, 
    email text, 
    phone int 
    PRIMARY KEY ((email)) 
) WITH 
    bloom_filter_fp_chance=0.010000 AND 
    caching='KEYS_ONLY' AND 
    comment='' AND 
    dclocal_read_repair_chance=0.100000 AND 
    gc_grace_seconds=864000 AND 
    index_interval=128 AND 
    read_repair_chance=0.000000 AND 
    replicate_on_write='true' AND 
    populate_io_cache_on_flush='false' AND 
    default_time_to_live=0 AND 
    speculative_retry='99.0PERCENTILE' AND 
    memtable_flush_period_in_ms=0 AND 
    compaction={'class': 'SizeTieredCompactionStrategy'} AND 
    compression={'sstable_compression': 'LZ4Compressor'}; 

mise à jour rapide: Je sauver essayé une autre classe Test.java. Il a été mappé à une table "test_info". Je suis l'erreur suivante

org.springframework.cassandra.support.exception.CassandraInvalidQueryException: unconfigured columnfamily test; nested exception is com.datastax.driver.core.exceptions.InvalidQueryException: unconfigured columnfamily test 
at org.springframework.cassandra.support.CassandraExceptionTranslator.translateExceptionIfPossible(CassandraExceptionTranslator.java:128) 
at org.springframework.cassandra.core.CqlTemplate.potentiallyConvertRuntimeException(CqlTemplate.java:946) 
at org.springframework.cassandra.core.CqlTemplate.translateExceptionIfPossible(CqlTemplate.java:930) 
at org.springframework.cassandra.core.CqlTemplate.translateExceptionIfPossible(CqlTemplate.java:912) 
at org.springframework.cassandra.core.CqlTemplate.doExecute(CqlTemplate.java:278) 
at org.springframework.cassandra.core.CqlTemplate.doExecute(CqlTemplate.java:559) 
at org.springframework.cassandra.core.CqlTemplate.execute(CqlTemplate.java:1323) 
at org.springframework.data.cassandra.core.CassandraTemplate.doInsert(CassandraTemplate.java:708) 
at org.springframework.data.cassandra.core.CassandraTemplate.insert(CassandraTemplate.java:290) 
at org.springframework.data.cassandra.core.CassandraTemplate.insert(CassandraTemplate.java:285) 

Je me demande si mon nom de classe Java et le nom de la table dans cassandra doit toujours être le même. Parce qu'il cherche la colonne column "test" au lieu de "test_info" que j'ai spécifié dans l'annotation @Table.

Ci-dessous la description de mon keyspace

CREATE KEYSPACE data_collection WITH replication = { 
    'class': 'SimpleStrategy', 
    'replication_factor': '3' 
}; 

EDIT - RESOLU: J'ai trouvé la solution basée sur la conversation avec @pinkpanther. J'avais importé com.datastax.driver.mapping.annotations.Table au lieu de org.springframework.data.cassandra.mapping.Table, ce qui explique pourquoi il n'a pas respecté le mappage de nom de table. Merci de votre aide.

+0

Essayez votre requête avec cqlsh et vérifiez si la table existe, assurez-vous également que vous êtes connecté au bon point de contact et à l'espace –

+0

Spring Data pour Apache Cassandra n'est pas ORM ... il n'y a pas de relations dans Cassandra mappeur d'objet. – mp911de

+0

@AshrafulIslam Ma requête dans cqlsh fonctionne correctement. Et même à travers Java mon fetch fonctionne comme prévu sans aucune erreur. Je ne suis pas sûr si c'est à cause de l'objet select où je spécifie explicitement le nom de la table, mais cela fonctionne. J'ai un problème seulement pendant l'insertion. Et oui, je suis connecté à l'espace de touches correct. – lazytc

Répondre

0

Le problème peut être avec l'importation de paquet de Table, Spring Data Cassandra a besoin de org.springframework.data.cassandra.mapping.Table. Remplacez le com.datastax.driver.mapping.annotations.Table importé avec celui-ci.