Cassandra UDT issue

29 views
Skip to first unread message

Wayne Y.W. Lee

unread,
May 20, 2019, 11:30:42 PM5/20/19
to kundera-discuss
Hi, 

I have 3 classes as below,




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) {
        this.name = name;
    }
    public String getName() {
        return this.name;
    }

    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("name", this.name)
                .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("name", this.name)
                .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

Reply all
Reply to author
Forward
0 new messages