"we cannot use it in set (manager.dsl().update().fromBaseTable().<no option for c3>)" --> normal and intended, it is forbidden to update a column which belongs to the primary key.
On Fri, Feb 12, 2016 at 1:50 PM, Atul Saroha <atul.sar...@snapdeal.com> wrote: > sorry I was my understanding issue of solution 2. Thanks for the solution > > > --------------------------------------------------------------------------------------------------------------------- > Atul Saroha > *Sr. Software Engineer* > *M*: +91 8447784271 *T*: +91 124-415-6069 *EXT*: 12369 > Plot # 362, ASF Centre - Tower A, Udyog Vihar, > Phase -4, Sector 18, Gurgaon, Haryana 122016, INDIA > > On Fri, Feb 12, 2016 at 3:39 PM, Atul Saroha <atul.sar...@snapdeal.com> > wrote: > >> Thanks for the reply. We would go with solution 1. >> >> One more thing, which might be a bug. We are using 4.0.1 version. And >> query of solution 2 is not possible. c3 is cluster key. No option is >> visible for this cluster key: >> >> 1. we cannot use it in set (manager.dsl().update().fromBaseTable().<no >> option for c3>) >> 2. even after where clause (only available option is based on id " >> :manager.dsl().update().fromBaseTable().c4_Set("1").where().id_Eq(id)") >> in DSL. >> >> >> @Entity(keyspace = "ks" , table="PrimeUser") >> >>> public class PrimeUser { >>> >>> @PartitionKey >>> >>>> @Column("id") >>>> >>> private int id; >>> >>> @Column("c1") >>> @Static >>> private String c1; >>> >>> @Column("c2") >>> @Static >>> private Boolean c2; >>> >>> >>> @Column("c3") >>> @ClusteringColumn(1) >>> private String c3; >>> >>> @Column("c4") >>> private String c4; >>> >>> } >>> >>> Regards, >> >> >> >> --------------------------------------------------------------------------------------------------------------------- >> Atul Saroha >> *Sr. Software Engineer* >> *M*: +91 8447784271 *T*: +91 124-415-6069 *EXT*: 12369 >> Plot # 362, ASF Centre - Tower A, Udyog Vihar, >> Phase -4, Sector 18, Gurgaon, Haryana 122016, INDIA >> >> On Fri, Feb 12, 2016 at 3:01 PM, DuyHai Doan <doanduy...@gmail.com> >> wrote: >> >>> "How could I achieve Delta Update through this ORM where I want to >>> inserting one row for id,c3,c4 columns only" >>> >>> 2 ways: >>> >>> 1. Create an empty PrimeUser entity with only id, c3 and c4 values. Use >>> manager >>> .crud() >>> .insert(entity) >>> .withInsertStrategy(InsertStrategy.NOT_NULL_FIELDS) >>> .execute() >>> >>> This way, Achilles will only extract the 3 columns (id, c3, c4) and >>> generates only INSERT INTO primeuser(id,c3,c4) VALUES(...) and skip >>> inserting null values >>> >>> >>> 2. Use the Update DSL >>> >>> manager >>> .dsl() >>> .update() >>> .fromBaseTable() >>> .c3_Set("....") >>> .c4_Set("....") >>> .where() >>> .id_Eq(partitionKey) >>> .execute() >>> >>> >>> "Since Achilies does not have persistence context like hibernate does, >>> to track what has beed updated in my java entity and update the change only >>> though DynamicUpdate anotation." >>> >>> This is made on-purpose. Having a proxy to intercept calls to setters >>> and to track what has been updated would require a "read-before-write" e.g. >>> load existing data first from Cassandra into the proxy. And >>> read-before-write is an anti-pattern. >>> >>> Optionally, one could create an empty proxy without read-before-write >>> and intercept only data that have been added to the entity. And this is >>> exactly what solution 1. does: create a new empty instance of PrimeUser, >>> populate some values and user insert() with NOT_NULL_FIELDS insert >>> strategy. The only difference is that Achilles creates INSERT statement >>> instead of UPDATE. >>> >>> >>> >>> >>> >>> On Fri, Feb 12, 2016 at 9:02 AM, Atul Saroha <atul.sar...@snapdeal.com> >>> wrote: >>> >>>> Thanks Doan, >>>> >>>> We are now evaluating or nearly finalized to use Achilles. >>>> >>>> We are looking for one use case. >>>> As I mentioned in above for static columns. >>>> >>>>> CREATE TABLE IF NOT EXISTS ks.PrimeUser( >>>>> id int, >>>>> c1 text STATIC, >>>>> c2 boolean STATIC, >>>>> c3 text, >>>>> c4 text, >>>>> PRIMARY KEY (id, c3) >>>>> >>>> ); >>>>> >>>> How could I achieve Delta Update through this ORM where I want to >>>> inserting one row for id,c3,c4 columns only or updating one row for c4 >>>> column only against ( id,c3). If I use my entity PrimeUser.java and crud >>>> insert method then it will insert all columns including static. >>>> I think that there is only one way which is to use update method of >>>> dsl/Query API. Since Achilies does not have persistence context like >>>> hibernate does, to track what has beed updated in my java entity and update >>>> the change only though DynamicUpdate anotation. >>>> Or there is something I am missing here?. >>>> >>>> Thanks , reply will be highly appreciated >>>> >>>> >>>> >>>> --------------------------------------------------------------------------------------------------------------------- >>>> Atul Saroha >>>> *Sr. Software Engineer* >>>> *M*: +91 8447784271 *T*: +91 124-415-6069 *EXT*: 12369 >>>> Plot # 362, ASF Centre - Tower A, Udyog Vihar, >>>> Phase -4, Sector 18, Gurgaon, Haryana 122016, INDIA >>>> >>>> On Tue, Feb 9, 2016 at 8:32 PM, DuyHai Doan <doanduy...@gmail.com> >>>> wrote: >>>> >>>>> Look at Achilles and how it models Partition key & clustering columns: >>>>> >>>>> >>>>> >>>>> https://github.com/doanduyhai/Achilles/wiki/5-minutes-Tutorial#clustered-entities >>>>> >>>>> >>>>> >>>>> On Tue, Feb 9, 2016 at 12:48 PM, Atul Saroha <atul.sar...@snapdeal.com >>>>> > wrote: >>>>> >>>>>> I know the most popular ORM api >>>>>> >>>>>> 1. Kundera : >>>>>> >>>>>> https://github.com/impetus-opensource/Kundera/wiki/Using-Compound-keys-with-Kundera >>>>>> 2. Hector (outdated- no longer in development) >>>>>> >>>>>> I am bit confuse to model this table into java domain entity structure >>>>>> >>>>>> CREATE TABLE IF NOT EXISTS ks.PrimeUser( >>>>>> id int, >>>>>> c1 text STATIC, >>>>>> c2 boolean STATIC, >>>>>> c3 text, >>>>>> c4 text, >>>>>> PRIMARY KEY (id, c3) >>>>>> ); >>>>>> >>>>>> >>>>>> One way is to create compound key based on id and c3 column as shown >>>>>> below. >>>>>> >>>>>>> @Entity >>>>>>> @Table(name="PrimeUser", schema="ks") >>>>>>> public class PrimeUser >>>>>>> { >>>>>>> >>>>>>> @EmbeddedId >>>>>>> private CompoundKey key; >>>>>>> >>>>>>> @Column >>>>>>> private String c1; >>>>>>> @Column >>>>>>> private String c2; >>>>>>> @Column >>>>>>> private String c4; >>>>>>> } >>>>>>> >>>>>>> Here key has to be an Embeddable entity: >>>>>>> >>>>>>> @Embeddable >>>>>>> public class CompoundKey >>>>>>> { >>>>>>> @Column private int id; >>>>>>> @Column private String c1; >>>>>>> } >>>>>>> >>>>>>> Then again when we fetch the data based on id only then c1 and c2 >>>>>> will be duplicated multiple times object, even though they are stored per >>>>>> "id" basis. c3 column is cluster key and its corresponding value is >>>>>> mapped >>>>>> to column c4. We avoid using map<c3,c4> here as it will cause performance >>>>>> hit. Also he have use cases to fetch the data based on (b1,c3) both also. >>>>>> >>>>>> Is there any other ORM API which handle such scenario. >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> --------------------------------------------------------------------------------------------------------------------- >>>>>> Atul Saroha >>>>>> *Sr. Software Engineer* >>>>>> *M*: +91 8447784271 *T*: +91 124-415-6069 *EXT*: 12369 >>>>>> Plot # 362, ASF Centre - Tower A, Udyog Vihar, >>>>>> Phase -4, Sector 18, Gurgaon, Haryana 122016, INDIA >>>>>> >>>>> >>>>> >>>> >>> >> >