Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我已经使用PartitionKey注释声明了主键,但仍然获取实体顺序并没有声明主键_Java_Datastax_Datastax Java Driver - Fatal编程技术网

Java 我已经使用PartitionKey注释声明了主键,但仍然获取实体顺序并没有声明主键

Java 我已经使用PartitionKey注释声明了主键,但仍然获取实体顺序并没有声明主键,java,datastax,datastax-java-driver,Java,Datastax,Datastax Java Driver,我有以下几点建议: @Entity public class Order { @Column(name = "id") @PartitionKey private String id; @Column(name = "customer_id") private String customerId; @Column(name = "loyalty_id") pr

我有以下几点建议:

@Entity
public class Order {    
    
    @Column(name = "id")
    @PartitionKey
    private String id;

    @Column(name = "customer_id")
    private String customerId;

    @Column(name = "loyalty_id")
    private String loyaltyId;

    @Column(name = "customer_email")
    private String customerEmail;

    public Order() {

    }
    public String getId() {
       return id;
    }

    public void setId(String id) {
        this.id = id;
    }
    ... getters and setters
}
在以下代码处获取异常:

            CqlSession session = CqlSession.builder().build();
            OrderMapper mapper = new OrderMapperBuilder(session).build();
            orderDao = mapper.orderDao(CqlIdentifier.fromCql(connectionManager.getSession().getLoggedKeyspace()));
connectionManager的定义如下:

例外情况如下:

    Entity Order does not declare a primary key
    com.datastax.oss.driver.api.mapper.MapperException: Entity Order does not declare a primary key
        at com.datastax.oss.driver.api.mapper.MapperException.copy(MapperException.java:44)
        at com.datastax.oss.driver.internal.core.util.concurrent.CompletableFutures.getUninterruptibly(CompletableFutures.java:149)
    ...
我是通过以下文档来实现的:。可能的原因是什么

编辑:-添加架构定义:

    CREATE TABLE order_keyspace.order (
        id text PRIMARY KEY,
        customer_email text,
        customer_id text,
        loyalty_id text
    ) WITH bloom_filter_fp_chance = 0.01
        AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
        AND comment = ''
        AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
        AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
        AND crc_check_chance = 1.0
        AND dclocal_read_repair_chance = 0.1
        AND default_time_to_live = 0
        AND gc_grace_seconds = 864000
        AND max_index_interval = 2048
        AND memtable_flush_period_in_ms = 0
        AND min_index_interval = 128
        AND read_repair_chance = 0.0
        AND speculative_retry = '99PERCENTILE';
完全编辑:

这里发生的一些事情让我感到困惑,我复制错误的唯一方法是破坏getter/setter,它在代码中似乎没有错误,但是正在发生一些复制/粘贴转换。到目前为止,我所能看到的情况如下:

  • @Column(name=“id”)的使用-它不是com.datastax.oss.driver.api.mapper.annotations中的注释@应使用CqlName
  • 在表中使用保留关键字-术语“order”是保留关键字,我很确定这会在代码中造成相当大的混乱-尽管我在尝试使用关键字作为映射器的表名时遇到了不同的错误。我认为您应该将此表命名为其他名称,并避免使用关键字
注释链接: 包含可用的规则/注释,您可以在那里看到@CqlName的用法,如果Cassandra列名与命名约定不同,则可以将其告知映射器

我相信您在前面的问题中使用了4.2驱动程序-但是如果更新为4.7(推荐),那么这就是链接:)

以下代码工作正常:

Cql:

Pojo:

DaoMapper:

import com.datastax.oss.driver.api.core.CqlIdentifier;
import com.datastax.oss.driver.api.mapper.annotations.*;

@Mapper
public interface DaoMapper {

    @DaoFactory
    OrderDao orderDao(@DaoKeyspace CqlIdentifier keyspace);
}
订单号:

import com.datastax.oss.driver.api.mapper.annotations.Dao;
import com.datastax.oss.driver.api.mapper.annotations.Delete;
import com.datastax.oss.driver.api.mapper.annotations.Insert;
import com.datastax.oss.driver.api.mapper.annotations.Select;

@Dao
public interface OrderDao {

    @Select
    CustomerOrders findById(String id);

    @Insert
    void save(CustomerOrders order);

    @Delete
    void delete(CustomerOrders order);
}
然后,我创建了一个简单的测试片段:

 @Test
    void GetRecordViaOrderDao() {
        try (CqlSession session = CqlSession.builder().build()) {

            DaoMapper daoMapper = new DaoMapperBuilder(session).build();
            OrderDao orderDao = daoMapper.orderDao(CqlIdentifier.fromCql("killrvideo"));
            CustomerOrders order = orderDao.findById("a");
            System.out.println(order.getCustomerEmail());
        }
    }
在本例中,killrvideo键空间是因为我正在点击一个Astra DB,这就是我目前在那里的键空间

Result: a@b.c.com
驱动程序版本4.7.2在my pom.xml中指定

完全编辑:

这里发生的一些事情让我感到困惑,我复制错误的唯一方法是破坏getter/setter,它在代码中似乎没有错误,但是正在发生一些复制/粘贴转换。到目前为止,我所能看到的情况如下:

  • @Column(name=“id”)的使用-它不是com.datastax.oss.driver.api.mapper.annotations中的注释@应使用CqlName
  • 在表中使用保留关键字-术语“order”是保留关键字,我很确定这会在代码中造成相当大的混乱-尽管我在尝试使用关键字作为映射器的表名时遇到了不同的错误。我认为您应该将此表命名为其他名称,并避免使用关键字
注释链接: 包含可用的规则/注释,您可以在那里看到@CqlName的用法,如果Cassandra列名与命名约定不同,则可以将其告知映射器

我相信您在前面的问题中使用了4.2驱动程序-但是如果更新为4.7(推荐),那么这就是链接:)

以下代码工作正常:

Cql:

Pojo:

DaoMapper:

import com.datastax.oss.driver.api.core.CqlIdentifier;
import com.datastax.oss.driver.api.mapper.annotations.*;

@Mapper
public interface DaoMapper {

    @DaoFactory
    OrderDao orderDao(@DaoKeyspace CqlIdentifier keyspace);
}
订单号:

import com.datastax.oss.driver.api.mapper.annotations.Dao;
import com.datastax.oss.driver.api.mapper.annotations.Delete;
import com.datastax.oss.driver.api.mapper.annotations.Insert;
import com.datastax.oss.driver.api.mapper.annotations.Select;

@Dao
public interface OrderDao {

    @Select
    CustomerOrders findById(String id);

    @Insert
    void save(CustomerOrders order);

    @Delete
    void delete(CustomerOrders order);
}
然后,我创建了一个简单的测试片段:

 @Test
    void GetRecordViaOrderDao() {
        try (CqlSession session = CqlSession.builder().build()) {

            DaoMapper daoMapper = new DaoMapperBuilder(session).build();
            OrderDao orderDao = daoMapper.orderDao(CqlIdentifier.fromCql("killrvideo"));
            CustomerOrders order = orderDao.findById("a");
            System.out.println(order.getCustomerEmail());
        }
    }
在本例中,killrvideo键空间是因为我正在点击一个Astra DB,这就是我目前在那里的键空间

Result: a@b.c.com


驱动程序版本4.7.2是在我的pom.xml中指定的

@Andrew谢谢,我对
@PartitionKey
使用了错误的导入。正确的方法是导入com.datastax.oss.driver.api.mapper.annotations.PartitionKey@Andrew谢谢你,我对
@PartitionKey
使用了错误的导入。正确的方法是导入com.datastax.oss.driver.api.mapper.annotations.PartitionKey您已经提到过。

您的键空间也被称为order吗?mapper.orderDao(cklidentifier.fromCql(“order”);似乎表明是,但只是想再检查一下。@Andrew是的,只是那个。我还尝试从会话中使用loggedKeySpace。@Andrew我有一个名为ConnectionManager的类,如下所示:和另一个名为OrderRepositoryService的类,其中连接管理器用作:您的键空间也被称为order吗?mapper.orderDao(cklidentifier.fromCql(“order”);似乎表明是,但只是想再检查一下。@Andrew是的,只是那个。我还尝试从会话中使用loggedKeySpace。@Andrew我有一个名为ConnectionManager的类,如下所示:和另一个名为OrderRepositoryService的类,其中连接管理器用作:我尝试删除
@Column
注释。没有帮助。也,主键列名打算用作
id
本身,因此我不认为有必要在那里使用
@CqlName
注释。请在问题中包含来自Cassandra的订单表的架构定义。嘿@Andrew我也用架构定义更新了问题。我添加了主键的getter/setter代码谢谢,我将使用您提供的代码尝试复制-创建表order\u keyspace.order-您说过该键空间称为order,而不是order\u keyspace,这只是粘贴时所做的修改吗?我尝试删除
@Column
注释。没有帮助。也,主键列名打算用作
id
本身,因此我不认为有必要在那里使用
@CqlName
注释。请在问题中包含来自Cassandra的订单表的架构定义。嘿@Andrew我也用架构定义更新了问题。我添加了主键的getter/setter代码谢谢,我将使用您提供的代码尝试复制-创建表order\u keyspace.order-您说过键空间称为order,而不是order\u keyspace,这只是粘贴时的修改吗?