Generating Keys

Generated keys is a mechanism that database generate an automatic value for you, can be auto-generated at column level or a sequence level.

Cassandra doesn’t have SEQUENCE like as Oracle, but you can use UUIDs as Surrogate Key.

Using Cassandra UUID

Creating table:

CREATE TABLE AUTHOR ( 
  ID text, 
  NAME text, 
  PRIMARY KEY (ID)
);

Statement query in xml file:

<statements 
 xmlns="http://jkniv.sf.net/schema/sqlegance/statements" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://jkniv.sf.net/schema/sqlegance/statements http://jkniv.sf.net/schema/sqlegance/sqlegance-stmt.xsd"
 >
  <insert id="Author#add">
    <autoGeneratedKey strategy="SEQUENCE" properties="id">
     select uuid() FROM system.local
    </autoGeneratedKey>
    INSERT INTO AUTHOR (ID, NAME) VALUES (:id, :name)
  </insert>
</statements>

How check the results:

Author author = new Author();
author.setName("John Lennon");
int rows = repositoryDb.add(author); 
assertThat(rows, is(java.sql.Statement.SUCCESS_NO_INFO));// cassandra driver don't count the number of rows was affected
assertThat(author.getId(), notNullValue());

For compatibility reasons you can use the strategy="AUTO" but doesn’t exist a increment value into Apache Cassandra, the UUIDs mechanism will be use for whinstone-cassandra in this approach too.

<insert id="vechile-autokey-cassandra-case-increment">
  <autoGeneratedKey strategy="AUTO" properties="id"/>
  INSERT INTO AUTHOR (ID, NAME) VALUES (:id, :name)
</insert>

Note: the column type must be text or uuid.