2017-09-13 1 views
1

다음 키 정보 "data_collection"의 "user_info"테이블에 매핑 된 다음 사용자 정보 개체가 있습니다. 내 cassandra 데이터베이스에 "user_info"테이블을 만들었습니다. 나는 아래의 JAVA와 spring annotation에서 cassandra 데이터베이스에 연결하기 위해 spring 데이터 cassandra를 사용하고있다. 삽입 중 구성되지 않은 열 패밀리 오류

@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; 
    } 
} 

나는 내 "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); 
     } 

    } 

내 selectOne 메서드는 삽입하는 동안 나는 다음과 같은 예외를 얻고있는 반면 제대로 작동합니다. 위의 주석을 사용하여 UserInfo.java 클래스를 테이블 이름 "user_info"에 매핑했습니다. 나는 왜 삽입이 테이블 "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) 

카산드라의 테이블의 설명을 검색 할 수 있습니다.

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'}; 

빠른 업데이트 : 난 그냥 다른 클래스 Test.java를 저장했습니다. 테이블 "test_info"에 매핑되었습니다. 다음 오류가 발생했습니다.

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) 

Java 클래스 이름과 cassandra의 테이블 이름이 항상 동일해야하는지 궁금합니다. 왜냐하면 내가 columnFamily "test_info"대신에 "test"를 찾고 있기 때문에 @Table 주석에 지정했습니다. 내가 @pinkpanther과의 대화를 기반으로 해결책을 발견 :이 해결 -

다음은 내 키 스페이스

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

편집의 설명이다. org.springframework.data.cassandra.mapping.Table 대신 com.datastax.driver.mapping.annotations.Table을 가져 와서 테이블 이름 매핑을 따르지 않는 이유가 있습니다. 당신의 도움을 주셔서 감사합니다.

+0

cqlsh를 사용하여 쿼리를 시도하고 테이블이 있는지 확인하십시오. 올바른 연락처와 키 스페이스에 연결되어 있는지 확인하십시오. –

+0

Apache Cassandra 용 스프링 데이터는 ORM이 아닙니다 ... Cassandra에는 본질적으로 관계가 없습니다. 객체 매퍼. – mp911de

+0

@AshrafulIslam cqlsh의 내 쿼리가 정상적으로 작동합니다. 그리고 심지어 Java를 통해 내 가져 오기는 어떤 오류없이 예상대로 작동합니다. 테이블의 이름을 명시 적으로 지정하는 select 객체로 인해 확실하지는 않지만 작동합니다. 나는 삽입하는 동안에 만 문제가있다. 그리고 네, 올바른 키 공간에 연결되어 있습니다. – lazytc

답변

0

테이블, 스프링 데이터 카산드라 패키지 가져 오기 문제가있을 수 있습니다 org.springframework.data.cassandra.mapping.Table 필요합니다. 가져온 com.datastax.driver.mapping.annotations.Table을 가져온 것으로 바꿉니다.

관련 문제