ненастроенная ошибка семейства столбцов во время вставки

У меня есть следующий объект информации о пользователе, сопоставленный с таблицей «user_info» в моем пространстве ключей «data_collection». Я создал таблицу «user_info» в своей базе данных cassandra. Я использую Spring Data Cassandra для подключения к базе данных Cassandra из JAVA и аннотации Spring, как показано ниже.

@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)

Ниже вы найдете описание таблицы в 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'};

Быстрое обновление: я только что попытался сохранить еще один класс 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 всегда совпадать. Потому что он ищет семейство столбцов «test» вместо «test_info», которое я указал в аннотации @Table.

Ниже приведено описание моего пространства ключей

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

РЕДАКТИРОВАНИЕ - РЕШЕНО: я нашел решение, основанное на разговоре с @pinkpanther. Я импортировал com.datastax.driver.mapping.annotations.Table вместо org.springframework.data.cassandra.mapping.Table, поэтому он не соблюдал сопоставление имен таблиц. Спасибо за вашу помощь.


person lazytc    schedule 13.09.2017    source источник
comment
Попробуйте выполнить запрос с помощью cqlsh и проверьте, существует ли таблица, а также убедитесь, что вы подключились к правильной точке контакта и пространству ключей.   -  person Ashraful Islam    schedule 13.09.2017
comment
Spring Data для Apache Cassandra не является ORM... в Cassandra по своей сути нет отношений, поэтому это просто средство отображения объектов.   -  person mp911de    schedule 13.09.2017
comment
@AshrafulIslam Мой запрос в cqlsh работает нормально. И даже через Java моя выборка работает, как и ожидалось, без ошибок. Я не уверен, что это из-за объекта выбора, где я явно указываю имя таблицы, но это работает. У меня проблема только во время вставки. И да, я подключен к правильному пространству ключей.   -  person lazytc    schedule 13.09.2017
comment
@ mp911de Я отредактировал свой вопрос. Я использую Spring Data для подключения к базе данных Cassandra из своего приложения.   -  person lazytc    schedule 13.09.2017
comment
@lazytc Я подозреваю, что вы использовали неправильный класс стратегии при создании пространства ключей, какую стратегию вы использовали? Не могли бы вы описать вывод вашего пространства ключей?   -  person pinkpanther    schedule 13.09.2017
comment
@pinkpanther Я отредактировал вопрос и добавил описание своей таблицы. Я новичок в Кассандре. Дайте мне знать, если я должен предоставить больше деталей. Спасибо.   -  person lazytc    schedule 13.09.2017
comment
@lazytc Я спрашивал об описании пространства ключей   -  person pinkpanther    schedule 13.09.2017
comment
@pinkpanther Теперь я добавил описание пространства ключей.   -  person lazytc    schedule 13.09.2017
comment
@lazytc смотрите мой ответ, а также сколько у вас узлов?   -  person pinkpanther    schedule 13.09.2017
comment
Похоже, он игнорирует name=user_info в аннотации таблицы. Из какого пакета вы используете @Table? это из драйвера datastax или org.springframework.data.cassandra.mapping.Table?   -  person pinkpanther    schedule 13.09.2017
comment
@pinkpanther com.datastax.driver.mapping.annotations.Table это пакет. Это неправильно?   -  person lazytc    schedule 14.09.2017
comment
Спасибо за вашу помощь @pinkpanther. Проблема заключалась в неправильном импорте пакета. Я добавил это как редактирование к моему вопросу.   -  person lazytc    schedule 14.09.2017
comment
@lazytc Я добавил это как ответ для будущих посетителей, пожалуйста, примите ответ, если хотите.   -  person pinkpanther    schedule 14.09.2017


Ответы (1)


Проблема может быть связана с импортом пакета таблицы, Spring Data Cassandra нуждается в org.springframework.data.cassandra.mapping.Table. Замените им импортированный com.datastax.driver.mapping.annotations.Table.

person pinkpanther    schedule 14.09.2017