spring-data-cassandra 的用户定义类型

User Defined Type with spring-data-cassandra

我想创建如下模型,如何在 spring-data-cassandra 中使用用户定义的类型?

{
  email: "test@example.com",
  name: {
  fname: "First",
  lname: "Last"
  }
}

Spring Data Cassandra 目前在 SD Cassandra 的映射基础结构中不支持 Cassandra 数据库 UDTs or Tuple Types。但是,我们确实计划在即将发布的版本中解决这两个问题。

查看并关注 DATACASS-284 - Add support for TupleType/TupleValue and DATACASS-172 - How to handle CUSTOM, User Defined TYPEs 了解更多详情。

注意...

SD Cassandra 最近被移至 managed/maintained SD 项目的 Pivotal 保护伞下,我和 @mp911de 现在都是项目负责人。

我们最近 presented on SD Cassandra at SpringOne Platform 2016, where we outlined the roadmap(幻灯片 11,第 3 个项目符号)用于该项目。

SpringData Cassandra 现在支持用户定义的数据类型。最新版本 1.5.0.RELEASE 使用 Cassandra Data stax 驱动程序 3.1.3,因此它现在可以正常工作。请按照以下步骤使其正常工作

如何在 Spring Data Cassandra 中使用 UserDefinedType(UDT) 功能:

  1. 我们需要使用最新的 Spring 数据 Cassandra (1.5.0.RELEASE)

    组:'org.springframework.data',名称:'spring-data-cassandra',版本:'1.5.0.RELEASE'

  2. 确保它使用以下版本的 jar :

    datastax.cassandra.driver.version=3.1.3 spring.data.cassandra.version=1.5.0.RELEASE spring.data.commons.version=1.13.0.RELEASE spring.cql.version=1.5.0.RELEASE

  3. 在 Cassandra 中创建用户定义的类型:类型名称应与 POJO 中定义的相同 class

地址数据类型

CREATE TYPE address_type ( 
    id text, 
    address_type text, 
    first_name text, 
    phone text 
);
  1. 在 Cassandra 中使用其中一列作为 UDT 创建 column-family:

员工table:

CREATE TABLE employee( 
   employee_id uuid, 
   employee_name text, 
   address frozen, 
   primary key (employee_id, employee_name) 
);
  1. 在域class中,定义注解为-CassandraType的字段,DataType应为UDT:

    @Table("employee") 
    public class Employee { 
       -- othere fields-- 
       @CassandraType(type = DataType.Name.UDT, userTypeName = "address_type") 
       private Address address; 
    }
    
  2. 为用户定义类型创建域class:我们需要确保用户定义类型模式中的列名称必须与域中的字段名称相同class.

    @UserDefinedType("address_type") 
    public class Address { 
        @CassandraType(type = DataType.Name.TEXT) 
        private String id; 
        @CassandraType(type = DataType.Name.TEXT) 
        private String address_type; 
    }
    
  3. 在 Cassandra 配置中,将此更改为:

    @Bean public CassandraMappingContext mappingContext() throws Exception { 
        BasicCassandraMappingContext mappingContext = new BasicCassandraMappingContext(); 
        mappingContext.setUserTypeResolver(new 
        SimpleUserTypeResolver(cluster().getObject(), cassandraKeyspace)); 
        return mappingContext; 
    }
    
  4. 用户定义的类型在任何地方都应该具有相同的名称。例如

    @UserDefinedType("address_type")
    @CassandraType(type = DataType.Name.UDT, userTypeName = "address_type")
    CREATE TYPE address_type