다음 키 정보 "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을 가져 와서 테이블 이름 매핑을 따르지 않는 이유가 있습니다. 당신의 도움을 주셔서 감사합니다.
cqlsh를 사용하여 쿼리를 시도하고 테이블이 있는지 확인하십시오. 올바른 연락처와 키 스페이스에 연결되어 있는지 확인하십시오. –
Apache Cassandra 용 스프링 데이터는 ORM이 아닙니다 ... Cassandra에는 본질적으로 관계가 없습니다. 객체 매퍼. – mp911de
@AshrafulIslam cqlsh의 내 쿼리가 정상적으로 작동합니다. 그리고 심지어 Java를 통해 내 가져 오기는 어떤 오류없이 예상대로 작동합니다. 테이블의 이름을 명시 적으로 지정하는 select 객체로 인해 확실하지는 않지만 작동합니다. 나는 삽입하는 동안에 만 문제가있다. 그리고 네, 올바른 키 공간에 연결되어 있습니다. – lazytc