package com.jpa.model;
import io.swagger.annotations.ApiModel;
import org.apache.commons.lang.builder.ToStringBuilder;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.ElementCollection;
import java.util.List;
@Entity
@Table(name = "jpa_exp")
@ApiModel
public class JpaExpClass0 {
public static final String COL_ID0 = "vvv_id00";
public static final String COL_VAL0 = "vvv_valu";
public static final String COL_DLST = "vvv_vlst";
public static final String COL_EMBD = "vvv_embd";
@Id
@Column(name = COL_ID0)
String id0;
@Column(name = COL_VAL0)
Integer val0;
@Column(name = COL_DLST)
List<Double> vlst;
@Embedded
@ElementCollection
List<JpaExpEmbd00> embd;
public void setId0(String id) {
this.id0 = id;
}
public String getId0() {
return this.id0;
}
public void setVal0(Integer val0) {
this.val0 = val0;
}
public Integer getVal0() {
return this.val0;
}
public void setVlst(List<Double> vlist) { this.vlst = vlist; }
public List<Double> getVlst() {
return this.vlst;
}
public void setEmbd(List<JpaExpEmbd00> elst) { this.embd = elst; }
public List<JpaExpEmbd00> getEmbd() { return this.embd; }
@Override
public String toString() {
return new ToStringBuilder(this)
.append("id0", this.id0)
.append("val0", this.val0)
.append("vlst", this.vlst)
.append("embd", this.embd)
.toString();
}
}
package com.jpa.model;
import org.apache.commons.lang.builder.ToStringBuilder;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.Embedded;
import javax.persistence.ElementCollection;
import java.util.List;
@Embeddable
public class JpaExpEmbd00 {
public static final String COL_NAME = "www_name";
public static final String COL_DOUB = "www_dubl";
public static final String COL_ILST = "www_item";
public static final String COL_EMBD = "www_embd";
@Column(name = COL_NAME)
private String name;
@Column(name = COL_DOUB)
private Double valu;
@Column(name = COL_ILST)
private List<Integer> items;
@Embedded
@ElementCollection
private List<JpaExpEmbd01> other;
public void setName(String name) {
}
public String getName() {
}
public void setValu(Double val) {
this.valu = val;
}
public Double getValu() {
return this.valu;
}
public void setItems(List<Integer> items) { this.items = items; }
public List<Integer> getItems() {
return this.items;
}
public void setOther(List<JpaExpEmbd01> embd) { this.other= embd; }
public List<JpaExpEmbd01> getOther() { return this.other; }
@Override
public String toString() {
return new ToStringBuilder(this)
.append("valu", this.valu)
.append("item", this.items)
.append("othr", this.other)
.toString();
}
}
package com.jpa.model;
import org.apache.commons.lang.builder.ToStringBuilder;
import javax.persistence.Embeddable;
import javax.persistence.Column;
import java.util.List;
@Embeddable
public class JpaExpEmbd01 {
public static final String COL_NAME = "xxx_name";
public static final String COL_NUMB = "xxx_numb";
public static final String COL_SLST = "xxx_cntx";
@Column(name = COL_NAME)
private String name;
@Column(name = COL_NUMB)
private Integer numb;
@Column(name = COL_SLST)
private List<String> cntx;
public void setName(String name) {
this.name = name; }
public String getName() { return
this.name; }
public void setNumb(Integer num) { this.numb = num; }
public Integer getNumb() { return this.numb; }
public void setCntx(List<String> cntx) { this.cntx = cntx; }
public List<String> getCntx() { return this.cntx; }
public String toString() {
return new ToStringBuilder(this)
.append("numb", this.numb)
.append("cntx", this.cntx)
.toString();
}
}
And the Cassandra creates the following corresponding TYPE and TABLE,
cqlsh> DESCRIBE TYPE my_keyspace."JpaExpEmbd01";
CREATE TYPE my_keyspace."JpaExpEmbd01" (
xxx_numb int,
xxx_cntx list<text>,
xxx_name text
);
cqlsh> DESCRIBE TYPE my_keyspace."JpaExpEmbd00";
CREATE TYPE my_keyspace."JpaExpEmbd00" (
www_name text,
other list<frozen<"JpaExpEmbd01">>,
www_item list<int>,
www_dubl double
);
cqlsh> DESCRIBE TABLE my_keyspace.jpa_exp ;
CREATE TABLE my_keyspace.jpa_exp (
vvv_id00 text PRIMARY KEY,
embd list<frozen<"JpaExpEmbd00">>,
vvv_valu int,
vvv_vlst list<double>
) 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';
However, when I try to persist the object from JpaExpClass0, I git the following traceback
20:21:04.166 [http-nio-8080-exec-1] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.impetus.kundera.KunderaException: java.lang.ClassCastException: com.impetus.kundera.metadata.model.attributes.DefaultListAttribute cannot be cast to javax.persistence.metamodel.SingularAttribute] with root cause
java.lang.ClassCastException: com.impetus.kundera.metadata.model.attributes.DefaultListAttribute cannot be cast to javax.persistence.metamodel.SingularAttribute
at com.impetus.client.cassandra.thrift.CQLTranslator.buildElementCollectionValue(CQLTranslator.java:542) ~[kundera-cassandra-3.13.jar!/:na]
at com.impetus.client.cassandra.thrift.CQLTranslator.onTranslation(CQLTranslator.java:382) ~[kundera-cassandra-3.13.jar!/:na]
at com.impetus.client.cassandra.thrift.CQLTranslator.prepareColumnOrColumnValues(CQLTranslator.java:268) ~[kundera-cassandra-3.13.jar!/:na]
at com.impetus.client.cassandra.CassandraClientBase.createInsertQuery(CassandraClientBase.java:1018) ~[kundera-cassandra-3.13.jar!/:na]
at com.impetus.client.cassandra.CassandraClientBase.getPersistQueries(CassandraClientBase.java:1203) ~[kundera-cassandra-3.13.jar!/:na]
at com.impetus.client.cassandra.CassandraClientBase$CQLClient.persist(CassandraClientBase.java:1999) ~[kundera-cassandra-3.13.jar!/:na]
at com.impetus.kundera.client.cassandra.dsdriver.DSClient.onPersist(DSClient.java:133) ~[kundera-cassandra-ds-driver-3.13.jar!/:na]
at com.impetus.kundera.client.ClientBase.persist(ClientBase.java:114) ~[kundera-core-3.13.jar!/:na]
at com.impetus.kundera.lifecycle.states.ManagedState.handleFlush(ManagedState.java:197) ~[kundera-core-3.13.jar!/:na]
at com.impetus.kundera.graph.Node.flush(Node.java:531) ~[kundera-core-3.13.jar!/:na]
at com.impetus.kundera.persistence.PersistenceDelegator.flush(PersistenceDelegator.java:403) ~[kundera-core-3.13.jar!/:na]
at com.impetus.kundera.persistence.PersistenceDelegator.persist(PersistenceDelegator.java:145) ~[kundera-core-3.13.jar!/:na]
at com.impetus.kundera.persistence.EntityManagerImpl.persist(EntityManagerImpl.java:174) ~[kundera-core-3.13.jar!/:na]
....
....
However, on clqsh, I can manually INSERT the table, my_keyspace.jpa_exp, succesfully, as shown below
cqlsh> INSERT INTO my_keyspace.jpa_exp JSON '{
... "vvv_id00": "DDDD",
... "vvv_valu": 112233,
... "vvv_vlst": [1.1111, 2.2222, 3.3333],
... "embd": [{
... "www_name": "Hello World",
... "www_dubl": 8.8888,
... "www_item": [1, 2, 3],
... "other": [{
... "xxx_name": "That is a cat",
... "xxx_numb": 555,
... "xxx_cntx": ["AAA", "BBB", "CCC"]
... },
... {
... "xxx_name": "That is a rat",
... "xxx_numb": 666,
... "xxx_cntx": ["MMM", "NNN", "OOO"]
... }]
... },
... {
... "www_name": "Goodbye World",
... "www_dubl": 9.9999,
... "www_item": [9, 8, 7],
... "other": [{
... "xxx_name": "This is a dog",
... "xxx_numb": 777,
... "xxx_cntx": ["III", "JJJ", "KKK"]
... }]
... }]
... }';
cqlsh>
cqlsh>
cqlsh> SELECT * FROM my_keyspace.jpa_exp ;
vvv_id00 | embd | vvv_valu | vvv_vlst
----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------+--------------------------
DDDD | [{www_name: 'Hello World', other: [JpaExpEmbd01(xxx_numb=555, xxx_cntx=[u'AAA', u'BBB', u'CCC'], xxx_name=u'That is a cat'), JpaExpEmbd01(xxx_numb=666, xxx_cntx=[u'MMM', u'NNN', u'OOO'], xxx_name=u'That is a rat')], www_item: [1, 2, 3], www_dubl: 8.8888}, {www_name: 'Goodbye World', other: [JpaExpEmbd01(xxx_numb=777, xxx_cntx=[u'III', u'JJJ', u'KKK'], xxx_name=u'This is a dog')], www_item: [9, 8, 7], www_dubl: 9.9999}] | 112233 | [1.1111, 2.2222, 3.3333]
(1 rows)
cqlsh>
Does the Kundera support UDT embedded UDT in Cassandra?
Thanks,
Wayne