簡體   English   中英

Spring Boot 應用中的復合 Cassandra Key

[英]Composite Cassandra Key in Spring Boot Application

我有一個使用以下內容創建的 Cassandra 集群:

CREATE KEYSPACE IF NOT EXISTS activitylogs WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}  AND durable_writes = true;

CREATE TABLE IF NOT EXISTS activitylogs.activities (
        activity_id timeuuid,
        actor_id text,
        app_id text,
        item_id text,
        viewer_id text,
        activity_type int,
        ts timestamp,
        PRIMARY KEY (actor_id, activity_id, app_id)
    ) WITH CLUSTERING ORDER BY (activity_id DESC, app_id ASC);

INSERT INTO activities (activity_id,actor_id, app_id, item_id, viewer_id, activity_type) VALUES ( now(), 'fsdgs346-sdsd5-4242','blossom','ff235-fsd54-fadsfdfs45','hj923hjn-2jnkl23-323yfh',0);

我正在使用帶有以下 build.gradle 的 Eclipse:

group 'com.abc'
version '1.0-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'spring-boot'

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.2.5.RELEASE")
    }
}

jar {
    baseName = 'gs-serving-web-content'
    version =  '0.1.0'
}

repositories {
    mavenCentral()
}


sourceCompatibility = 1.8

repositories {
    mavenCentral()
}


dependencies {
    compile "org.springframework.boot:spring-boot-starter-web"
     compile "org.springframework.data:spring-data-cassandra:1.4.6.RELEASE"
    compile 'org.slf4j:slf4j-api:1.6.6'
    compile 'ch.qos.logback:logback-classic:1.0.13'
    testCompile "junit:junit"
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.3'
}

現在,我編寫了以下實體:

package com.abc.activitystream.entity;

import org.springframework.data.cassandra.mapping.Column;
import org.springframework.data.cassandra.mapping.PrimaryKey;
import org.springframework.data.cassandra.mapping.Table;

import java.security.Timestamp;

@Table(value = "activities")
public class Activity
{

    /*CREATE TABLE IF NOT EXISTS activitylogs.activities (
    activity_id timeuuid,
    actor_id text,
    app_id text,        
    item_id text,
    viewer_id text,
    activity_type int,
    ts timestamp,
    PRIMARY KEY (actor_id, activity_id, app_id)) WITH CLUSTERING ORDER BY (activity_id DESC);*/

    @PrimaryKey
    private ActivityKey ak;

    @Column(value = "item_id")
    private String item_id;

    @Column(value = "viewer_id")
    private String viewer_id;

    @Column(value = "activity_type")
    private int activity_type;

    @Column(value = "ts")
    private Timestamp ts;

    public String getItem_id() {
        return item_id;
    }

    public void setItem_id(String item_id) {
        this.item_id = item_id;
    }

    public String getViewer_id() {
        return viewer_id;
    }

    public void setViewer_id(String viewer_id) {
        this.viewer_id = viewer_id;
    }

    public int getActivity_type() {
        return activity_type;
    }

    public void setActivity_type(int activity_type) {
        this.activity_type = activity_type;
    }

    public Timestamp getTs() {
        return ts;
    }

    public void setTs(Timestamp ts) {
        this.ts = ts;
    }

    public ActivityKey getAk() {
        return ak;
    }

    public void setAk(ActivityKey ak) {
        this.ak = ak;
    }
}

由於該表使用復合主鍵,因此我必須使用此處提到的以下結構: http : //docs.spring.io/spring-data/cassandra/docs/1.0.2.RELEASE/reference/html/cassandra。核心.html

所以我的 ActivityKey 類是這樣的:

@PrimaryKeyClass
public class ActivityKey implements Serializable {

    @PrimaryKeyColumn(name = "actor_id",ordinal = 0,type = PrimaryKeyType.PARTITIONED)
    private String actor_id;

    @PrimaryKeyColumn(name="activity_id",ordinal = 1,type = PrimaryKeyType.CLUSTERED, ordering = Ordering.DESCENDING )
    private UUID activity_id = UUIDs.timeBased();

    @PrimaryKeyColumn(name="app_id", ordinal = 2, type = PrimaryKeyType.CLUSTERED, ordering = Ordering.ASCENDING)
    private String app_id;

    public String getActor_id() {
        return actor_id;
    }

    public void setActor_id(String actor_id) {
        this.actor_id = actor_id;
    }

    public UUID getActivity_id() {
        return activity_id;
    }

    public void setActivity_id(UUID activity_id) {
        this.activity_id = activity_id;
    }

    public String getApp_id() {
        return app_id;
    }

    public void setApp_id(String app_id) {
        this.app_id = app_id;
    }

    @Override
      public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((actor_id == null) ? 0 : actor_id.hashCode());
        result = prime * result + ((app_id == null) ? 0 : app_id.hashCode());
        return result;
      }

      @Override
      public boolean equals(Object obj) {
        if (this == obj)
          return true;
        if (obj == null)
          return false;
        if (getClass() != obj.getClass())
          return false;
        ActivityKey other = (ActivityKey) obj;
        if (actor_id == null) {
          if (other.actor_id != null)
            return false;
        } else if (!actor_id.equals(other.actor_id))
          return false;
        if (app_id == null) {
          if (other.app_id != null)
            return false;
        } else if (!app_id.equals(other.app_id))
          return false;
        return true;
      }

}

我的控制器是這樣的:

@RestController
public class ActivityController {

    @Autowired
    private ActivityRepository activityRepository;

    @RequestMapping(value = "/activity",method = RequestMethod.GET)
    @ResponseBody
    public List<Activity> activity() {
        List<Activity> activities = new ArrayList<>();
        activityRepository.findAll().forEach(e->activities.add(e));
        return activities;
    }

}

最后存儲庫是這樣的:

public interface ActivityRepository extends CassandraRepository<Activity> {

    @Query("SELECT*FROM activities WHERE actor_id=?0 LIMIT ?1")
    Iterable<Activity> findByActor_Id(String actor_id,Integer limit);

}

奇怪的是,該應用程序沒有運行並退出,並出現以下錯誤:

創建名為“greetingController”的 bean 時出錯:注入自動裝配的依賴項失敗; 嵌套異常是 org.springframework.beans.factory.BeanCreationException:無法自動裝配字段:private com.rg.cassandraspring.repository.ActivityRepository com.rg.cassandraspring.controller.GreetingController.activityRepository; 嵌套異常是 org.springframework.beans.factory.BeanCreationException:創建名為“activityRepository”的 bean 時出錯:調用 init 方法失敗; 嵌套異常是 org.springframework.data.cassandra.mapping.VerifierMappingExceptions: java.security.cert.CertPath: Cassandra 實體必須有 @Table、@Persistent 或 @PrimaryKeyClass 注釋

最后這是我的 CassandraConfig:

@Configuration
//@PropertySource(value = {"classpath:META-INF/cassandra.properties"})
@EnableCassandraRepositories(basePackages = {"com.abc"})
public class CassandraConfig {

    @Autowired
    private Environment environment;

    private static final Logger LOGGER = LoggerFactory.getLogger(CassandraConfig.class);

    @Bean
    public CassandraClusterFactoryBean cluster() {

        CassandraClusterFactoryBean cluster = new CassandraClusterFactoryBean();
        cluster.setContactPoints("localhost");
        cluster.setPort(Integer.parseInt("9042"));
        return cluster;
    }

    @Bean
    public CassandraMappingContext mappingContext() {
        return new BasicCassandraMappingContext();
    }

    @Bean
    public CassandraConverter converter() {
        return new MappingCassandraConverter(mappingContext());
    }

    @Bean
    public CassandraSessionFactoryBean session() throws Exception {

        CassandraSessionFactoryBean session = new CassandraSessionFactoryBean();
        session.setCluster(cluster().getObject());
        session.setKeyspaceName("activitylogs");
        session.setConverter(converter());
        session.setSchemaAction(SchemaAction.NONE);

        return session;
    }

    @Bean
    public CassandraOperations cassandraTemplate() throws Exception {
        return new CassandraTemplate(session().getObject());
    }

}

誰能幫我這個? 我似乎無法解決這個問題。

與您的問題不完全相關,spring 文檔指出,當您想在實體中存儲時間對象時,您應該使用:

  • Joda 時間:日期時間
  • 遺留 Java 日期和日歷
  • JDK8 日期和時間類型
  • 長或長

更多信息: https : //docs.spring.io/spring-data/cassandra/docs/current/reference/html/#auditing.annotations

該問題似乎屬於“時間戳”類型,用於表示“活動”表的“ts”列。 我將它從 java.util 更改為“Date”,一切似乎都運行良好。

我還沒有時間去調查原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM