使用Datastax Java驱动程序的Cassandra复合键

用户名

我是Cassandra的新手,正在尝试为我的模型进行评估。我正在使用CQL3和Cassandra 2.0进行测试

假设我有以下域模型

public class CompositeSample1 {

  private String id;

  private List<ChildT1> childrenT1;

  private List<ChildT2> childrenT2;

  private String rootAttr1;

//getters setters omitted for brevity
}

public class ChildT1 {

  private String key;

  private String attr1;

  private String attr2;
//getters setters omitted for brevity
}

public class ChildT2 {

  private String key;

  private String attrA;

  private String attrB;

//getters setters omitted for brevity
}

所以我想将上述模型存储在Cassandra中的一行中,分区键为CompositeSample1.id。我想将2个关系中的子级存储为复合列

id,rootAttr1,childT1 | 1 {attr1,attr2},childT1 | 2 {attr1,attr2} .. childT2 | 1 {attrA,attrB},childT2 | 2 {attrA,attrB}。

我尝试了以下方法:

使用以下代码创建架构:

session.execute(String.format("CREATE KEYSPACE IF NOT EXISTS %s WITH replication " +
                            "= {'class':'SimpleStrategy', 'replication_factor':3};", DbContext.DATABASE_NAME));

      session.execute("USE "+DbContext.DATABASE_NAME);


      session.execute("CREATE TABLE IF NOT EXISTS compositeSample1 (id uuid, rootAttr1 text, childT1Key text, childT1Attr1 text, , childT1Attr2 text "+
", childT2Key text, childT2AttrA text, childT2AttrB text, PRIMARY KEY ( (id), childT1Key, childT2Key))");

试图插入以下模型实例

CompositeSample1 compositeSample1 = new CompositeSample1();
    compositeSample1.setId(UUID.randomUUID().toString());
    compositeSample1.setRootAttr1("A380");
    compositeSample1.setChildrenT1(new ArrayList<ChildT1>());
    compositeSample1.setChildrenT2(new ArrayList<ChildT2>());

    for (int i=1;i<10; i++)
    {
      ChildT1 child1 = new ChildT1();
      child1.setKey("childT1|"+i);
      child1.setAttr1("T1_1_"+i);
      child1.setAttr2("T1_2_"+i);
      compositeSample1.getChildrenT1().add(child1);

      ChildT2 child2 = new ChildT2();
      child2.setKey("childT1|"+i);
      child2.setAttrA("T2A"+i);
      child2.setAttrB("T2B"+i);
      compositeSample1.getChildrenT2().add(child2);
    }

    dbContext.createCompositeSample1(compositeSample1);


where the code for createCompositeSample1 is:
public void createCompositeSample1(CompositeSample1 compositeSample1) {
    if (createCompositeSample1 == null)
         createCompositeSample1 = session.prepare("INSERT INTO " + DbContext.DATABASE_NAME + ".compositeSample1(id, childT1Key, childT2Key, rootAttr1) VALUES(?,?,?,?)");

    if (createCompositeSample1ChildT1 == null)
      createCompositeSample1ChildT1 = session.prepare("INSERT INTO " + DbContext.DATABASE_NAME + ".compositeSample1(id, childT1Key, childT2Key, childT1Attr1, childT1Attr2) VALUES(?,?,?,?,?)");


    if (createCompositeSample1ChildT2 == null)
      createCompositeSample1ChildT2 = session.prepare("INSERT INTO " + DbContext.DATABASE_NAME + ".compositeSample1(id, childT1Key, childT2Key, childT2AttrA, childT2AttrB) VALUES(?,?,?,?,?)");
    BoundStatement boundStatementParent = new BoundStatement(createCompositeSample1);

    getSession().execute(boundStatementParent.bind(UUID.fromString(compositeSample1.getId()), null, null, compositeSample1.getRootAttr1()));

    BoundStatement boundStatementChildT1 = new BoundStatement(createCompositeSample1ChildT1);
    for(ChildT1 childT1 : compositeSample1.getChildrenT1()){
      getSession().execute(boundStatementChildT1.bind(UUID.fromString(compositeSample1.getId()), childT1.getKey(), null, childT1.getAttr1(), childT1.getAttr2()));
    }

    BoundStatement boundStatementChildT2 = new BoundStatement(createCompositeSample1ChildT2);
    for(ChildT2 childT2 : compositeSample1.getChildrenT2()){
      getSession().execute(boundStatementChildT2.bind(UUID.fromString(compositeSample1.getId()), null, childT2.getKey(), childT2.getAttrA(), childT2.getAttrB()));
    }
  }

但我收到以下错误

com.datastax.driver.core.exceptions.InvalidQueryException:群集关键部分childt1key的无效null值

我的目标是:

  1. 证明我可以插入无任何子项的CompositeSample1
  2. 将孩子添加到正在进行的2个关系中

有人可以指出我做错了什么或没有正确理解吗?

谢谢

克米什拉

您可以更改主键部分,仅用单列制作复合分区键是没有意义的(在这种情况下,只有ID列作为复合分区键的一部分),如下所述创建表。

session.execute("CREATE TABLE IF NOT EXISTS compositeSample1 (id uuid, rootAttr1 text, childT1Key text, childT1Attr1 text, , childT1Attr2 text "+
", childT2Key text, childT2AttrA text, childT2AttrB text, PRIMARY KEY (id, childT1Key, childT2Key))");

您可以插入一个空字符串而不是空值,如下所示

BoundStatement boundStatementParent = new BoundStatement(createCompositeSample1);

        session.execute(boundStatementParent.bind(UUID.fromString(compositeSample1.getId()), StringUtils.EMPTY, StringUtils.EMPTY,
                compositeSample1.getRootAttr1()));

        BoundStatement boundStatementChildT1 = new BoundStatement(createCompositeSample1ChildT1);
        for (ChildT1 childT1 : compositeSample1.getChildrenT1())
        {
            session.execute(boundStatementChildT1.bind(UUID.fromString(compositeSample1.getId()), childT1.getKey(),
                    StringUtils.EMPTY, childT1.getAttr1(), childT1.getAttr2()));
        }

        BoundStatement boundStatementChildT2 = new BoundStatement(createCompositeSample1ChildT2);
        for (ChildT2 childT2 : compositeSample1.getChildrenT2())
        {
            session.execute(boundStatementChildT2.bind(UUID.fromString(compositeSample1.getId()), StringUtils.EMPTY,
                    childT2.getKey(), childT2.getAttrA(), childT2.getAttrB()));
        }

它应该为您工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Datastax Java Cassandra驱动程序:使用WHERE的多个AND语句?

来自分类Dev

无法使用 Cassandra Datastax Java 驱动程序连接到 Cassandra 节点之一

来自分类Dev

使用datastax cassandra驱动程序3.0运行描述架构

来自分类Dev

Nodejs - Apache Cassandra(使用 Datastax 驱动程序)

来自分类Dev

如何使用Datastax Java驱动程序有效地使用批写入Cassandra?

来自分类Dev

Cassandra:使用DataStax Java驱动程序选择一系列TimeUUID

来自分类Dev

如何使用带有Datastax Java驱动程序的CQL向Cassandra添加任意列?

来自分类Dev

如何使用DataStax Java驱动程序设置Cassandra客户端到节点的加密?

来自分类Dev

使用DataStax Java驱动程序1.0.5连接到Cassandra时出现ConnectionException

来自分类Dev

使用datastax Java驱动程序2.1.4连接到Cassandra集群太慢

来自分类Dev

如何使用带有Datastax Java驱动程序的CQL向Cassandra添加任意列?

来自分类Dev

NoClassDefFoundError-Cassandra的datastax Java驱动程序

来自分类Dev

带分页的Datastax Cassandra Java驱动程序RetryPolicy

来自分类Dev

带分页的Datastax Cassandra Java驱动程序RetryPolicy

来自分类Dev

使用Datastax Java驱动程序插入列系列吗?

来自分类Dev

使用Datastax Java驱动程序以JSON查询行

来自分类Dev

Datastax Cassandra驱动程序引发CodecNotFoundException

来自分类Dev

如何在Cassandra中使用Datastax Java驱动程序有效地使用准备好的语句?

来自分类Dev

使用DataStax Java驱动程序1.0.4通过CQL连接到Cassandra时发生异常

来自分类Dev

无法使用DataStax C#驱动程序从Cassandra获取值

来自分类Dev

使用Datastax CQL驱动程序插入Cassandra时设置TTL

来自分类Dev

使用DataStax C#驱动程序时故障转移不适用于Cassandra

来自分类Dev

使用DataStax C#驱动程序处理Cassandra中的所有节点关闭

来自分类Dev

使用DataStax C#驱动程序进行Cassandra批处理插入

来自分类Dev

Datastax Node.js Cassandra驱动程序何时使用映射器与查询

来自分类Dev

使用DataStax C#驱动程序时故障转移不适用于Cassandra

来自分类Dev

使用DataStax C#驱动程序处理Cassandra中的所有节点

来自分类Dev

如何使用 C# Datastax 驱动程序删除 Cassandra 上的表?

来自分类Dev

使用 Datastax Cassandra 驱动程序时出现无效类型错误

Related 相关文章

  1. 1

    Datastax Java Cassandra驱动程序:使用WHERE的多个AND语句?

  2. 2

    无法使用 Cassandra Datastax Java 驱动程序连接到 Cassandra 节点之一

  3. 3

    使用datastax cassandra驱动程序3.0运行描述架构

  4. 4

    Nodejs - Apache Cassandra(使用 Datastax 驱动程序)

  5. 5

    如何使用Datastax Java驱动程序有效地使用批写入Cassandra?

  6. 6

    Cassandra:使用DataStax Java驱动程序选择一系列TimeUUID

  7. 7

    如何使用带有Datastax Java驱动程序的CQL向Cassandra添加任意列?

  8. 8

    如何使用DataStax Java驱动程序设置Cassandra客户端到节点的加密?

  9. 9

    使用DataStax Java驱动程序1.0.5连接到Cassandra时出现ConnectionException

  10. 10

    使用datastax Java驱动程序2.1.4连接到Cassandra集群太慢

  11. 11

    如何使用带有Datastax Java驱动程序的CQL向Cassandra添加任意列?

  12. 12

    NoClassDefFoundError-Cassandra的datastax Java驱动程序

  13. 13

    带分页的Datastax Cassandra Java驱动程序RetryPolicy

  14. 14

    带分页的Datastax Cassandra Java驱动程序RetryPolicy

  15. 15

    使用Datastax Java驱动程序插入列系列吗?

  16. 16

    使用Datastax Java驱动程序以JSON查询行

  17. 17

    Datastax Cassandra驱动程序引发CodecNotFoundException

  18. 18

    如何在Cassandra中使用Datastax Java驱动程序有效地使用准备好的语句?

  19. 19

    使用DataStax Java驱动程序1.0.4通过CQL连接到Cassandra时发生异常

  20. 20

    无法使用DataStax C#驱动程序从Cassandra获取值

  21. 21

    使用Datastax CQL驱动程序插入Cassandra时设置TTL

  22. 22

    使用DataStax C#驱动程序时故障转移不适用于Cassandra

  23. 23

    使用DataStax C#驱动程序处理Cassandra中的所有节点关闭

  24. 24

    使用DataStax C#驱动程序进行Cassandra批处理插入

  25. 25

    Datastax Node.js Cassandra驱动程序何时使用映射器与查询

  26. 26

    使用DataStax C#驱动程序时故障转移不适用于Cassandra

  27. 27

    使用DataStax C#驱动程序处理Cassandra中的所有节点

  28. 28

    如何使用 C# Datastax 驱动程序删除 Cassandra 上的表?

  29. 29

    使用 Datastax Cassandra 驱动程序时出现无效类型错误

热门标签

归档