用户定义的类型,带有spring-data-cassandra

时间:2016-08-10 00:30:23

标签: spring spring-data-cassandra

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

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

2 个答案:

答案 0 :(得分:16)

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

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

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

    group:'org.springframework.data',name:'spring-data-cassandra',version:'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类中定义的相同

  4. 地址数据类型

    CREATE TYPE address_type ( 
        id text, 
        address_type text, 
        first_name text, 
        phone text 
    );
    
    1. 在Cassandra中创建列系列,其中一列为UDT:
    2. 员工表:

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

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

        @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
        

答案 1 :(得分:2)

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

有关详细信息,请参阅并关注DATACASS-284 - Add support for TupleType/TupleValueDATACASS-172 - How to handle CUSTOM, User Defined TYPEs

请注意...

SD Cassandra最近被移植到管理/维护SD项目的Pivotal保护伞下,我和@mp911de现在都是项目主管。

我们最近在2016年SpringOne平台上的SD Cassandra上presented,在那里我们概述了项目的roadmap(幻灯片11,第3个子弹)。