2016-12-14 8 views
0

私はCassandraに触れ始めていますが、私はJOINできないので困っています。 JOINはそのままCQLで行うことができないので、私は代替手段を探してJavaアプリケーション側に参加しようと考えました。私はrepository.save(mydata)できませんSpring + CassandraでJOINのかなりの代替案を探しています

具体的には、@ OneToManyを使用してエンティティを結合しようとしましたが、次のエラーが表示されます。

良い解決策はありますか?

■プロジェクト構造

SpringBoot +春データのApache Cassandraの

バージョンについて:

  • 春ブーツ::(v1.3.5.RELEASE)
  • 春-データcassandra- 1.3.5.Release
  • cassandra 2.1.16

■エラーログ

com.datastax.driver.core.exceptions.InvalidQueryException: Unknown identifier emp 
at com.datastax.driver.core.Responses$Error.asException(Responses.java:102) ~[cassandra-driver-core-2.1.9.jar:na] 
at com.datastax.driver.core.DefaultResultSetFuture.onSet(DefaultResultSetFuture.java:149) ~[cassandra-driver-core-2.1.9.jar:na] 
at com.datastax.driver.core.RequestHandler.setFinalResult(RequestHandler.java:183) ~[cassandra-driver-core-2.1.9.jar:na] 
at com.datastax.driver.core.RequestHandler.access$2300(RequestHandler.java:44) ~[cassandra-driver-core-2.1.9.jar:na] 
at com.datastax.driver.core.RequestHandler$SpeculativeExecution.setFinalResult(RequestHandler.java:751) ~[cassandra-driver-core-2.1.9.jar:na] 

■ソース:コントローラ

@RequestMapping(value = "/DepartmentsCassandra/form", method = RequestMethod.POST) 
@Transactional(readOnly=false) 
public ModelAndView form(
     @RequestParam("department_id") int department_id, 
     @RequestParam("department_name") String department_name, 
     ModelAndView mav){ 
    Departments mydata = new Departments(); 
    mydata.setDepartment_id(department_id); 
    mydata.setDepartment_name(department_name); 
    repository.save(mydata);// ← Error occurred !!! 
    return new ModelAndView("redirect:/DepartmentsCassandra"); 
} 

■ソース:エンティティ:すっごく部門

package com.example.cassandra.entity; 

import java.util.ArrayList; 
import java.util.List; 
import javax.persistence.FetchType; 
import javax.persistence.JoinColumn; 
import javax.persistence.OneToMany; 
import org.springframework.cassandra.core.PrimaryKeyType; 
import org.springframework.data.cassandra.mapping.Column; 
import org.springframework.data.cassandra.mapping.PrimaryKeyColumn; 
import org.springframework.data.cassandra.mapping.Table; 
@Table(value="departments") 
public class Departments { 

@PrimaryKeyColumn(name = "department_id",ordinal = 1,type = PrimaryKeyType.PARTITIONED) 
private int department_id; 

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

public Departments(int department_id,String department_name){ 
    this.department_id = department_id; 
    this.department_name = department_name; 
} 

@OneToMany(fetch=FetchType.EAGER) 
@JoinColumn(name="department_id",insertable=false,updatable=false) 
private List<Employees> emp = new ArrayList<Employees>(); 

答えて

0

、使用して一般的なアンチパターンである "クライアント側が参加します" Cassandra。毎回1つではなく2つのクエリを実行するため、パフォーマンスが向上しません。 「結合された」すべてのデータを含む、各クエリ用の幅広いテーブルを作成する方法です。 あなたの場合は、テーブルemployee_by_departmentなどを作成してください。 datastax.comの入門コースをチェックしてください - 素晴らしいです:-)

+0

すぐに貴重なアドバイスをいただき、ありがとうございます。私はemployee_by_departmentを作成します。 しかし、それは学習段階にあるので今はいいですが、既存のRDBMSシステムをCassandraに置き換えたい場合、すべての結合点を修正するのは非常に苦労します。 良いアイデアはありますか? –

+0

それは苦しいでしょう。 Afaik、C *への移行のための「簡単な方法」はありません。また、テーブルの同期化(C * 3.0のマテリアライズド・ビューの検索)や、おそらく依存している「欠落した」トランザクションのような新しい課題にも対処する必要があります。 – rob

+0

盗むには、貴重な情報をありがとうございます。いろいろ考えていることがたくさんあるようです。 。 –

関連する問題