Cassandra Java驱动4.14:RKey主键类在RDAO中的定义问题
解决Cassandra复合主键独立类的映射问题
针对你用DataStax Java Driver 4.14版本遇到的主键类映射错误,需要做以下关键修正,同时补充必要依赖:
1. 补充实体映射所需依赖
你当前只引入了core模块,实体映射功能需要额外添加mapper相关依赖,在pom.xml中加入:
<dependency> <groupId>com.datastax.oss</groupId> <artifactId>java-driver-mapper-api</artifactId> <version>4.14.1</version> </dependency> <dependency> <groupId>com.datastax.oss</groupId> <artifactId>java-driver-mapper-runtime</artifactId> <version>4.14.1</version> </dependency>
2. 修正主键类RKey
给RKey类添加@PrimaryKeyClass注解,明确这是一个复合主键的封装类:
import com.datastax.oss.driver.api.mapper.annotations.PartitionKey; import com.datastax.oss.driver.api.mapper.annotations.PrimaryKeyClass; import com.datastax.oss.driver.api.mapper.annotations.CqlName; @PrimaryKeyClass public class RKey { @PartitionKey(0) @CqlName("mart_id") public int martId; @PartitionKey(1) @CqlName("product_id") public String productId; @PartitionKey(2) @CqlName("store_id") public String storeId; // Driver需要无参构造方法用于反射实例化 public RKey() {} // 可选:添加带参构造方便创建主键对象 public RKey(int martId, String productId, String storeId) { this.martId = martId; this.productId = productId; this.storeId = storeId; } }
3. 修正实体类RDAO
在RDAO的pk字段上添加@PrimaryKey注解,让Driver识别这个字段对应表的主键:
import com.datastax.oss.driver.api.mapper.annotations.Entity; import com.datastax.oss.driver.api.mapper.annotations.CqlName; import com.datastax.oss.driver.api.mapper.annotations.PrimaryKey; import java.nio.ByteBuffer; @Entity @CqlName("abc") public class RDAO { @PrimaryKey private RKey pk; @CqlName("compressed_rollup_data") private ByteBuffer compressedRollupData; @CqlName("metadata") private String metadata; // Driver需要无参构造方法 public RDAO() {} // 提供所有字段的getter/setter,保证Driver能正常访问字段 public RKey getPk() { return pk; } public void setPk(RKey pk) { this.pk = pk; } public ByteBuffer getCompressedRollupData() { return compressedRollupData; } public void setCompressedRollupData(ByteBuffer compressedRollupData) { this.compressedRollupData = compressedRollupData; } public String getMetadata() { return metadata; } public void setMetadata(String metadata) { this.metadata = metadata; } }
关键说明
@PrimaryKeyClass是Driver识别复合主键类的必要注解,没有它Driver无法将这个类与表的主键关联。@PrimaryKey注解标记实体类中的主键字段,告诉Driver该字段对应表的主键集合。- 实体类和主键类都必须提供无参构造方法;如果字段是private权限,必须配套getter/setter,否则Driver无法完成实例化和字段读写。
内容的提问来源于stack exchange,提问作者vidushi dwivedi
相关产品推荐
相关产品推荐

