使用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

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

来自分类Dev

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

来自分类Dev

NoClassDefFoundError-Cassandra的datastax Java驱动程序

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

Datastax Cassandra驱动程序引发CodecNotFoundException

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

Related 相关文章

  1. 1

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

  2. 2

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

  3. 3

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

  4. 4

    NoClassDefFoundError-Cassandra的datastax Java驱动程序

  5. 5

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

  6. 6

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

  7. 7

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

  8. 8

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

  9. 9

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

  10. 10

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

  11. 11

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

  12. 12

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

  13. 13

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

  14. 14

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

  15. 15

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

  16. 16

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

  17. 17

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

  18. 18

    Datastax Cassandra驱动程序引发CodecNotFoundException

  19. 19

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

  20. 20

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

  21. 21

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

  22. 22

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

  23. 23

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

  24. 24

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

  25. 25

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

  26. 26

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

  27. 27

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

  28. 28

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

  29. 29

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

热门标签

归档