【问题标题】:User Defined Type with spring-data-cassandra使用 spring-data-cassandra 的用户定义类型
【发布时间】:2016-12-16 04:35:54
【问题描述】:

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

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

【问题讨论】:

    标签: spring spring-data-cassandra


    【解决方案1】:

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

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

    1. 我们需要使用最新的 jar 的 Spring data 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 类中定义的相同

    地址数据类型

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

    员工表:

    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 Config 中,更改此项:

      @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
      

    【讨论】:

    • 是否可以在 DB 中制作 spring make 类型? (就像它对表模式所做的那样)
    【解决方案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 都是现在的项目负责人。

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

    【讨论】:

      猜你喜欢
      • 2018-01-11
      • 2017-12-18
      • 2014-12-30
      • 2014-12-31
      • 2018-01-04
      • 1970-01-01
      • 2021-08-25
      • 2016-09-01
      • 2016-03-21
      相关资源
      最近更新 更多