Is it possible to increment PK alone using kunderaCounter.xml in kundera2.8?

136 views
Skip to first unread message

subash b

unread,
Jan 14, 2014, 8:42:12 PM1/14/14
to kundera...@googlegroups.com
Hi,
 

Is it possible to increment PK using kunderaCounter.xml in kundera2.8?

Is it possible to make (PK) column type only as COUNTER in CF using kunderaCounter.xml? 
 
When I place my entity in kunderaCounter.xml, all my columns in CF will be marked as COUNTER.
 
 
-------------------------------------------------------------------------------------------------------------------
 
 
 
Employee entity
-----------------

@Entity
@Table(name = "employee")
@IndexCollection(columns = { @Index(name = "EMPLOYEE_NAME"),
  @Index(name = "DESIGNATION"), @Index(name = "EXPERIENCE"),
  @Index(name = "PROJECT") })
@NamedQueries({
  @NamedQuery(name = "retrieveEmployee", query = "select e from Employee e where e.employeeName = ?1"),
  @NamedQuery(name = "findEmployeeById", query = "select e from Employee e where e.employeeId = ?1") })
public class Employee {
 @Id
 @Column(name = "employee_id")
 @GeneratedValue(strategy = GenerationType.TABLE)
 private int employeeId;
 @Column(name = "employee_name")
 private String employeeName;
 @Column(name = "experience")
 private int experience;
 @Column(name = "designation")
 private String designation;
 @Column(name = "project")
 private String currentProject;
 .
 .
 //getter setter
 .
 }

Department entity
-----------------
@Entity
@Table(name = "department")
@IndexCollection(columns = { @Index(name = "dept_name"),
  @Index(name = "dept_code") })
@NamedQueries({
  @NamedQuery(name = "retrieveDepartment", query = "select d from Department d where d.deptName = ?1"),
  @NamedQuery(name = "findDeptById", query = "select d from Department d where d.deptId = ?1") })
public class Department {
 @Id
 @Column(name = "dept_id")
 @GeneratedValue(strategy = GenerationType.TABLE)
 private int deptId;
 @Column(name = "dept_name")
 private String deptName;
 @Column(name = "dept_code")
 private String deptCode;
 @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "deptId")
 private List<Employee> employeeList;
 .
 .
 //getter setter
 .
 }
-------------------------------------------------------------------------------------------------------------------
MY TC
  Department d = new Department();
  d.setDeptCode("101");
  // d.setDeptId(UUID.randomUUID().toString());
  d.setDeptName("eComm");
  Employee e1 = new Employee();
  e1.setCurrentProject("Proj1");
  e1.setDesignation("AST1");
  // e1.setEmployeeId(UUID.randomUUID().toString());
  e1.setEmployeeName("Subash1");
  e1.setExperience(1);
  Employee e2 = new Employee();
  e2.setCurrentProject("Proj2");
  e2.setDesignation("AST2");
  // e2.setEmployeeId(UUID.randomUUID().toString());
  e2.setEmployeeName("Subash2");
  e2.setExperience(2);
  Employee e3 = new Employee();
  e3.setCurrentProject("Proj3");
  e3.setDesignation("AST3");
  // e3.setEmployeeId(UUID.randomUUID().toString());
  e3.setEmployeeName("Subash3");
  e3.setExperience(2);
  Employee e4 = new Employee();
  e4.setCurrentProject("Proj4");
  e4.setDesignation("AST4");
  // e4.setEmployeeId(UUID.randomUUID().toString());
  e4.setEmployeeName("Subash4");
  e4.setExperience(2);
  List<Employee> el = new ArrayList<Employee>();
  el.add(e1);
  el.add(e2);
  el.add(e3);
  el.add(e4);
  d.setEmployeeList(el);
  em.persist(d);
-------------------------------------------------------------------------------------------------------------------
after test run, kundera_sequences output is
cqlsh:jan10> select * from kundera_sequences;
 key        | sequence_value
------------+----------------
 department |              1
   employee |              4
(2 rows)
-------------------------------------------------------------------------------------------------------------------
PU
 
<persistence-unit name="cassandra-pu">
  <provider>com.impetus.kundera.KunderaPersistence</provider>
  <class>com.impetus.kundera.entities.Department</class>
  <class>com.impetus.kundera.entities.Employee</class>
  <exclude-unlisted-classes>true</exclude-unlisted-classes>
  <properties>
   <property name="jboss.as.jpa.managed" value="false" />
   <property name="kundera.nodes" value="localhost" />
   <property name="kundera.port" value="9160" />
   <property name="kundera.keyspace" value="jan10" />
   <property name="kundera.dialect" value="cassandra" />
   <property name="kundera.ddl.auto.prepare" value="create" />
   <property name="kundera.client" value="thrift" />
   <property name="kundera.client.lookup.class"
    value="com.impetus.client.cassandra.thrift.ThriftClientFactory" />
   <property name="kundera.cache.provider.class"
    value="com.impetus.kundera.cache.ehcache.EhCacheProvider" />
   <property name="kundera.cache.config.resource" value="/ehcache-test.xml" />
   <property name="kundera.client.property" value="kunderaCounter.xml" />
  </properties>
 </persistence-unit>

-------------------------------------------------------------------------------------------------------------------
kunderaCounter.xml is
 

<?xml version="1.0" encoding="UTF-8"?>
<clientProperties>
 <datastores>
  <dataStore>
   <name>cassandra</name>
   <schemas>
    <schema>
     <name>jan10</name>
     <tables>
      <table>
       <name>department</name>
       <properties>
        <property name="default.validation.class" value="CounterColumnType"></property>
        <property name="key.validation.class" value="UTF8Type"></property>
       </properties>
      </table>
      <table>
       <name>employee</name>
       <properties>
        <property name="default.validation.class" value="CounterColumnType"></property>
        <property name="key.validation.class" value="UTF8Type"></property>
       </properties>
      </table>
     </tables>
    </schema>
   </schemas>
  </dataStore>
 </datastores>
</clientProperties>

-------------------------------------------------------------------------------------------------------------------
Trace
WARNING: Counter value not found for sequence_name, resetting it to zero.
Jan 14, 2014 3:37:06 PM com.impetus.client.cassandra.CassandraClientBase createUpdateQueryForCounter
INFO: Returning update query UPDATE "department" SET "dept_name"="dept_name"+'eComm', "dept_code"="dept_code"+'101' WHERE "key"=1.
Jan 14, 2014 3:37:06 PM com.impetus.client.cassandra.thrift.ThriftClient onPersist
SEVERE: Error while persisting record, Caused by: .
InvalidRequestException(why:Invalid STRING constant (eComm) for dept_name of type counter)
 at org.apache.cassandra.thrift.Cassandra$execute_cql3_query_result.read(Cassandra.java:37849)
 at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78)
 at org.apache.cassandra.thrift.Cassandra$Client.recv_execute_cql3_query(Cassandra.java:1562)
 at org.apache.cassandra.thrift.Cassandra$Client.execute_cql3_query(Cassandra.java:1547)
 at com.impetus.client.cassandra.CassandraClientBase$CQLClient.persist(CassandraClientBase.java:1865)
 at com.impetus.client.cassandra.thrift.ThriftClient.onPersist(ThriftClient.java:150)
 at com.impetus.kundera.client.ClientBase.persist(ClientBase.java:88)
 at com.impetus.client.cassandra.thrift.ThriftClient.persist(ThriftClient.java:132)
 at com.impetus.kundera.lifecycle.states.ManagedState.handleFlush(ManagedState.java:183)
 at com.impetus.kundera.graph.Node.flush(Node.java:533)
 at com.impetus.kundera.persistence.PersistenceDelegator.flush(PersistenceDelegator.java:413)
 at com.impetus.kundera.persistence.PersistenceDelegator.persist(PersistenceDelegator.java:151)
 at com.impetus.kundera.persistence.EntityManagerImpl.persist(EntityManagerImpl.java:168)
 at com.impetus.kundera.dao.PersistenceDAO.insertEmployeeAndDept(PersistenceDAO.java:156)
 at com.impetus.kundera.dao.PersistenceDAO.main(PersistenceDAO.java:239)
Exception in thread "main" com.impetus.kundera.KunderaException: com.impetus.kundera.KunderaException: InvalidRequestException(why:Invalid STRING constant (eComm) for dept_name of type counter)
 at com.impetus.kundera.persistence.EntityManagerImpl.persist(EntityManagerImpl.java:174)
 at com.impetus.kundera.dao.PersistenceDAO.insertEmployeeAndDept(PersistenceDAO.java:156)
 at com.impetus.kundera.dao.PersistenceDAO.main(PersistenceDAO.java:239)
Caused by: com.impetus.kundera.KunderaException: InvalidRequestException(why:Invalid STRING constant (eComm) for dept_name of type counter)
 at com.impetus.client.cassandra.thrift.ThriftClient.onPersist(ThriftClient.java:168)
 at com.impetus.kundera.client.ClientBase.persist(ClientBase.java:88)
 at com.impetus.client.cassandra.thrift.ThriftClient.persist(ThriftClient.java:132)
 at com.impetus.kundera.lifecycle.states.ManagedState.handleFlush(ManagedState.java:183)
 at com.impetus.kundera.graph.Node.flush(Node.java:533)
 at com.impetus.kundera.persistence.PersistenceDelegator.flush(PersistenceDelegator.java:413)
 at com.impetus.kundera.persistence.PersistenceDelegator.persist(PersistenceDelegator.java:151)
 at com.impetus.kundera.persistence.EntityManagerImpl.persist(EntityManagerImpl.java:168)
 ... 2 more
Caused by: InvalidRequestException(why:Invalid STRING constant (eComm) for dept_name of type counter)
 at org.apache.cassandra.thrift.Cassandra$execute_cql3_query_result.read(Cassandra.java:37849)
 at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78)
 at org.apache.cassandra.thrift.Cassandra$Client.recv_execute_cql3_query(Cassandra.java:1562)
 at org.apache.cassandra.thrift.Cassandra$Client.execute_cql3_query(Cassandra.java:1547)
 at com.impetus.client.cassandra.CassandraClientBase$CQLClient.persist(CassandraClientBase.java:1865)
 at com.impetus.client.cassandra.thrift.ThriftClient.onPersist(ThriftClient.java:150)
 ... 9 more
 
-------------------------------------------------------------------------------------------------------------------
 
 
 
 
 

Thanks


kunderaCounter question.zip

Vivek Mishra

unread,
Jan 15, 2014, 12:15:03 AM1/15/14
to subash b, kundera...@googlegroups.com
Kundera supports auto generation of primary key for both table and sequence. Please have a look at:

https://github.com/impetus-opensource/Kundera/tree/trunk/src/kundera-cassandra/src/test/java/com/impetus/client/generatedId

Sincerely,
-Vivek
________________________________________
From: subash b [dumm...@gmail.com]
Sent: 15 January 2014 07:12
To: kundera...@googlegroups.com
Subject: Is it possible to increment PK alone using kunderaCounter.xml in kundera2.8?
________________________________






NOTE: This message may contain information that is confidential, proprietary, privileged or otherwise protected by law. The message is intended solely for the named addressee. If received in error, please destroy and notify the sender. Any use of this email is prohibited when received in error. Impetus does not represent, warrant and/or guarantee, that the integrity of this communication has been maintained nor that the communication is free of errors, virus, interception or interference.

subash b

unread,
Jan 15, 2014, 12:59:22 AM1/15/14
to kundera...@googlegroups.com

Thanks Vivek. I will look in to this example.
> --
> You received this message because you are subscribed to the Google Groups "kundera-discuss" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to kundera-discu...@googlegroups.com.
> For more options, visit https://groups.google.com/groups/opt_out.
>

subash b

unread,
Jan 15, 2014, 6:54:19 PM1/15/14
to kundera...@googlegroups.com
 
 
Refered below thread and increment PK is working as expected for MayToOne. Thanks.
 
Can you plz let me know what I am doing wrong in attached entities.
 
Follow up questions for attached entities.
 
 
1. My first run TestCase working as expected when I mark <property name="kundera.ddl.auto.prepare" value="create" />. (Rerun will recreate CF again in this case).
 
2. To maintain existing data, during second run mark <property name="kundera.ddl.auto.prepare" value="validate" />. In this case I am getting below error.
 Jan 15, 2014 11:09:15 AM com.impetus.client.cassandra.schemamanager.CassandraSchemaManager validate
 SEVERE: Error occurred while validating jan10, Caused by: .
 com.impetus.kundera.configure.schema.SchemaGenerationException: com.impetus.kundera.configure.schema.SchemaGenerationException: Column family kundera_sequences does not exist in keyspace jan10
 at com.impetus.client.cassandra.schemamanager.CassandraSchemaManager.validate(CassandraSchemaManager.java:438)
 at com.impetus.kundera.configure.schema.api.AbstractSchemaManager.handleOperations(AbstractSchemaManager.java:258)
 at com.impetus.kundera.configure.schema.api.AbstractSchemaManager.exportSchema(AbstractSchemaManager.java:108)
 at com.impetus.client.cassandra.schemamanager.CassandraSchemaManager.exportSchema(CassandraSchemaManager.java:142)
 at com.impetus.kundera.configure.SchemaConfiguration.configure(SchemaConfiguration.java:185)
 at com.impetus.kundera.configure.ClientMetadataBuilder.buildClientFactoryMetadata(ClientMetadataBuilder.java:45)
 at com.impetus.kundera.persistence.EntityManagerFactoryImpl.configureClientFactories(EntityManagerFactoryImpl.java:349)
 at com.impetus.kundera.persistence.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:113)
 at com.impetus.kundera.KunderaPersistence.createEntityManagerFactory(KunderaPersistence.java:83)
 at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:122)
 at com.impetus.kundera.dao.PersistenceDAO.<init>(PersistenceDAO.java:41)
 at com.impetus.kundera.dao.PersistenceDAO.<init>(PersistenceDAO.java:33)
 at com.impetus.kundera.dao.PersistenceDAO.main(PersistenceDAO.java:237)
 Caused by: com.impetus.kundera.configure.schema.SchemaGenerationException: Column family kundera_sequences does not exist in keyspace jan10
 at com.impetus.client.cassandra.schemamanager.CassandraSchemaManager.onValidateTable(CassandraSchemaManager.java:950)
 at com.impetus.client.cassandra.schemamanager.CassandraSchemaManager.onValidateTables(CassandraSchemaManager.java:921)
 at com.impetus.client.cassandra.schemamanager.CassandraSchemaManager.validate(CassandraSchemaManager.java:433)
 ... 12 more
 
3. To maintain existing data, during second run, remove property kundera.ddl.auto.prepare. In this case I am getting below error.
em.setProperty(CassandraConstants.CQL_VERSION,CassandraConstants.CQL_VERSION_3_0);
em.persist(dept);
 Jan 15, 2014 12:48:37 PM com.impetus.client.cassandra.CassandraClientBase createInsertQuery
 INFO: Returning cql query  INSERT INTO "department"("dept_id","dept_name","dept_code") VALUES(2,'eComm','101') .
 Jan 15, 2014 12:48:37 PM com.impetus.client.cassandra.thrift.ThriftClient onPersist

 SEVERE: Error while persisting record, Caused by: .
 InvalidRequestException(why:Unknown identifier dept_id)

 at org.apache.cassandra.thrift.Cassandra$execute_cql3_query_result.read(Cassandra.java:37849)
 at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78)
 at org.apache.cassandra.thrift.Cassandra$Client.recv_execute_cql3_query(Cassandra.java:1562)
 at org.apache.cassandra.thrift.Cassandra$Client.execute_cql3_query(Cassandra.java:1547)
 at com.impetus.client.cassandra.CassandraClientBase$CQLClient.persist(CassandraClientBase.java:1865)
 at com.impetus.client.cassandra.thrift.ThriftClient.onPersist(ThriftClient.java:150)
 at com.impetus.kundera.client.ClientBase.persist(ClientBase.java:88)
 at com.impetus.client.cassandra.thrift.ThriftClient.persist(ThriftClient.java:132)
 at com.impetus.kundera.lifecycle.states.ManagedState.handleFlush(ManagedState.java:183)
 at com.impetus.kundera.graph.Node.flush(Node.java:533)
 at com.impetus.kundera.persistence.PersistenceDelegator.flush(PersistenceDelegator.java:413)
 at com.impetus.kundera.persistence.PersistenceDelegator.persist(PersistenceDelegator.java:151)
 at com.impetus.kundera.persistence.EntityManagerImpl.persist(EntityManagerImpl.java:168)
 at com.impetus.kundera.dao.PersistenceDAO.insertEmployeeAndDept(PersistenceDAO.java:158)
 at com.impetus.kundera.dao.PersistenceDAO.main(PersistenceDAO.java:241)
 Exception in thread "main" com.impetus.kundera.KunderaException: com.impetus.kundera.KunderaException: InvalidRequestException(why:Unknown identifier dept_id)
 at com.impetus.kundera.persistence.EntityManagerImpl.persist(EntityManagerImpl.java:174)
 at com.impetus.kundera.dao.PersistenceDAO.insertEmployeeAndDept(PersistenceDAO.java:158)
 at com.impetus.kundera.dao.PersistenceDAO.main(PersistenceDAO.java:241)
 Caused by: com.impetus.kundera.KunderaException: InvalidRequestException(why:Unknown identifier dept_id)

 at com.impetus.client.cassandra.thrift.ThriftClient.onPersist(ThriftClient.java:168)
 at com.impetus.kundera.client.ClientBase.persist(ClientBase.java:88)
 at com.impetus.client.cassandra.thrift.ThriftClient.persist(ThriftClient.java:132)
 at com.impetus.kundera.lifecycle.states.ManagedState.handleFlush(ManagedState.java:183)
 at com.impetus.kundera.graph.Node.flush(Node.java:533)
 at com.impetus.kundera.persistence.PersistenceDelegator.flush(PersistenceDelegator.java:413)
 at com.impetus.kundera.persistence.PersistenceDelegator.persist(PersistenceDelegator.java:151)
 at com.impetus.kundera.persistence.EntityManagerImpl.persist(EntityManagerImpl.java:168)
 ... 2 more
 Caused by: InvalidRequestException(why:Unknown identifier dept_id)

 at org.apache.cassandra.thrift.Cassandra$execute_cql3_query_result.read(Cassandra.java:37849)
 at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78)
 at org.apache.cassandra.thrift.Cassandra$Client.recv_execute_cql3_query(Cassandra.java:1562)
 at org.apache.cassandra.thrift.Cassandra$Client.execute_cql3_query(Cassandra.java:1547)
 at com.impetus.client.cassandra.CassandraClientBase$CQLClient.persist(CassandraClientBase.java:1865)
 at com.impetus.client.cassandra.thrift.ThriftClient.onPersist(ThriftClient.java:150)
 ... 9 more
 
4. I am not allowed to create CF via code and it should be manual. To do so, I can first create CF before install/deploy the application and remove property "kundera.ddl.auto.prepare" from pu.xml. Tried same and end up with below exception
So first create CF like
cqlsh:jan10> CREATE TABLE department (dept_id bigint,dept_code text,dept_name text,PRIMARY KEY (dept_id,dept_code,dept_name) );
cqlsh:jan10> CREATE TABLE employee (employee_id bigint,dept_id bigint,designation text,employee_name text,experience int,project text,PRIMARY KEY (employee_id,experience));
cqlsh:jan10> CREATE TABLE kundera_sequences (key text,sequence_value counter,PRIMARY KEY (key));
And now exception trace is
 Exception in thread "main" com.impetus.kundera.KunderaException: com.impetus.kundera.KunderaException: InvalidRequestException(why:Not enough bytes to read value of component 0)
 at com.impetus.kundera.persistence.EntityManagerImpl.persist(EntityManagerImpl.java:174)
 at com.impetus.kundera.dao.PersistenceDAO.insertEmployeeAndDept(PersistenceDAO.java:157)
 at com.impetus.kundera.dao.PersistenceDAO.main(PersistenceDAO.java:240)
 Caused by: com.impetus.kundera.KunderaException: InvalidRequestException(why:Not enough bytes to read value of component 0)
 at com.impetus.client.cassandra.CassandraClientBase.getGeneratedValue(CassandraClientBase.java:1700)
 at com.impetus.client.cassandra.thrift.ThriftClient.generate(ThriftClient.java:1057)
 at com.impetus.client.cassandra.thrift.ThriftClient.generate(ThriftClient.java:93)
 at com.impetus.kundera.persistence.IdGenerator.onTableGenerator(IdGenerator.java:163)
 at com.impetus.kundera.persistence.IdGenerator.generateAndSetId(IdGenerator.java:67)
 at com.impetus.kundera.graph.ObjectGraphBuilder.getNode(ObjectGraphBuilder.java:111)
 at com.impetus.kundera.graph.ObjectGraphBuilder.getObjectGraph(ObjectGraphBuilder.java:75)
 at com.impetus.kundera.persistence.PersistenceDelegator.persist(PersistenceDelegator.java:136)

 at com.impetus.kundera.persistence.EntityManagerImpl.persist(EntityManagerImpl.java:168)
 ... 2 more
 Caused by: InvalidRequestException(why:Not enough bytes to read value of component 0)
 at org.apache.cassandra.thrift.Cassandra$get_result.read(Cassandra.java:6592)
 at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78)
 at org.apache.cassandra.thrift.Cassandra$Client.recv_get(Cassandra.java:556)
 at org.apache.cassandra.thrift.Cassandra$Client.get(Cassandra.java:541)
 at com.impetus.client.cassandra.CassandraClientBase.getGeneratedValue(CassandraClientBase.java:1662)
 ... 10 more
OneToMany kundera incrementor.zip

Chhavi Gangwal

unread,
Jan 17, 2014, 3:12:25 AM1/17/14
to kundera...@googlegroups.com
Hi,
I had a look into sample project and given below are the findings:

1. Since auto generation id support is via counter column and Kundera implicitly manages it, so you don't need to define CounterColumnType explicitly in kunderaCounter.xml. It will only be required, in case you want to create an entity over Counter column family.

2. Counter column support in Kundera is implemented for thrift(e.g. CQL2) only. Hence for point 2,3 and 4, we have verified and raised given below issues:

https://github.com/impetus-opensource/Kundera/issues/499
https://github.com/impetus-opensource/Kundera/issues/500


I will plan and post an update on these issues, once CQL3 counter column support is added.

Hope it Helps.

Regards,
Chhavi

subash b

unread,
Jan 18, 2014, 10:45:36 PM1/18/14
to kundera...@googlegroups.com
Hi Chaavi,

Thanks for the reply. Sure i will followup those thread.

Reply all
Reply to author
Forward
0 new messages