Cassandra List <UDT>не десериализован с использованием datastax java driver 4.0.0 - PullRequest
0 голосов
/ 02 апреля 2020

Я сейчас работаю над новым проектом и выбрал Cassandra в качестве нашего хранилища данных. У меня есть сценарий использования, в котором я храню цены на материал и для этого sh создал список пользовательских типов (UDT). Но, к сожалению, пока происходит десериализация с использованием драйвера datastax. После запросов на требуемые данные я обнаружил, что объект списка является нулевым, в то время как в базе данных есть значение для него. Это текущее ограничение для драйвера Cassandra java или я что-то упустил?

Вот так выглядит моя упрощенная сущность (таблица):

    @PrimaryKeyColumn(name = "tenant_id", ordinal = 0, type = PrimaryKeyType.PARTITIONED)
    private long tenantId;
    @PrimaryKeyColumn(name = "item_id", ordinal = 1, type = PrimaryKeyType.CLUSTERED)
    private String itemId;
    @CassandraType(type = DataType.Name.LIST, userTypeName = "volume_scale_1")
    private List<VolumeScale> volumeScale1;
}

Итак, я получаю volumeScale1 как null после запроса выбора базы данных.

А вот так выглядит мой UDT:

  1. В базе данных Cassandra:
CREATE TYPE pricingservice.volume_scale (
    from_scale int,
    to_scale int,
    value frozen<price_value>
);
Как UDT в java:
@UserDefinedType("volume_scale")
public class VolumeScale
{  
   @CassandraType(type = DataType.Name.TEXT, userTypeName = "from_scale")
   @Column("from_scale")
   private String fromScale;

   @CassandraType(type = DataType.Name.TEXT, userTypeName = "to_scale")
   @Column("to_scale")
   private String toScale;
   @CassandraType(type = DataType.Name.UDT, userTypeName = "value")
   private PriceValue value;
   // getter and setter
}

Я также пытался использовать Object Mapper из java самого драйвера согласно предложению @Alex, но застрял на одном Точка, в которой создание объекта с использованием ItemPriceByMaterialMapperBuilder вызывает ошибку компиляции. Требуется ли что-нибудь дополнительное для обработки аннотаций или я что-то упустил? Есть ли у вас какие-либо идеи, как использовать аннотацию Mapper? Я использовал Google AutoService также для внешней обработки аннотаций, но не работал.


    @Mapper
    //@AutoService(Processor.class)
    public interface ItemPriceByMaterialMapper
    // extends Processor
    {
        static MapperBuilder<ItemPriceByMaterialMapper> builder(CqlSession session) {
            return new ItemPriceByMaterialMapperBuilder(session);
          }

        @DaoFactory
        ItemPriceByMaterialDao itemPriceByMaterialDao ();

        // @DaoFactory
        // ItemPriceByMaterialDao itemPriceByMaterialDao(@DaoKeyspace CqlIdentifier
        // keyspace);
    }

Используемая версия:

Java Версия: 1.8

DataStax OSS java -Driver-Mapper-Processor: 4.5.1

DataStax OSS java -Driver-Mapper-Runtime: 4.5.1

Cassandra: 3.11.4

Spring Базовая структура загрузки: 2.2.4.RELEASE

Ответы [ 2 ]

0 голосов
/ 12 апреля 2020

Я решил не использовать объект сопоставления и работать с Spring Data Cassandra с Spring 2.2.6-RELEASE. Спасибо

0 голосов
/ 02 апреля 2020

Насколько я понимаю, у вас есть несколько проблем: если вы используете Spring Data Cassandra, то вы получите более старый драйвер (3.7.2 для Spring 2.2.6-RELEASE), и он может получить sh с драйвер 4.0.0 (он слишком старый, не используйте его), который вы пытаетесь использовать. Драйвер 4.x не совместим в двоичном формате с предыдущими драйверами, и его поддержка в Spring Data Cassandra может быть только в следующем основном выпуске Spring.

Вместо Spring Data вы можете использовать Object Mapper из java самого драйвера - он может быть более оптимизирован, чем версия Spring.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...