> > I do acknowledge that this awkward usability issue is quite annoying and > complicates applications' architecture. Problem with Spring Data
Sorry, sent the message with the first paragraph left unfinished. "Problem with Spring Data" - just wanted to highlight that the current separation on key and value POJOs leads to other clumsy usability issues: https://issues.apache.org/jira/browse/IGNITE-13028 - Denis On Thu, May 21, 2020 at 12:03 PM Denis Magda <dma...@apache.org> wrote: > Folks, thanks for the details. I do acknowledge that this awkward > usability issue is quite annoying and complicates applications' > architecture. Problem with Spring Data > > At the moment, I use the workaround mentioned by Alexey Kukushkin. Guess > many of us already use it in productions: > > - PersonKey and PersonValue POJOs are used by Ignite repository > abstractions that put or read data to/from Ignite. Those POJOs don't have > repetitive fields. > - Person POJO class is a high-level model that has all the fields of > the table (key + value). PersonKey and PersonValue are converted to a > Person instance by a repository abstraction and that instance is used by > other high-level abstractions of my applications (services, controller, > etc.). > > Personally, the proposed solution for the problem still sounds complicated > to me. It still requires me, as an application developer, to do some extra > settings in the CacheConfiguration and CREATE TABLE statements. > > Let me know what you think about an alternative approach, I've been > contemplating for a while. Those of us who use JPA, Spring Data or > Hibernate frameworks are aware of the Entity abstraction. Which is > basically a POJO class of your business domain model that goes with all the > fields defined in an associated relational/NoSQL table. You use special > annotations to define indexes, primary keys and other relations in that > Entity class. My thinking was to upgrade Ignite cache APIs to the state > when we no longer require to create key POJOs. Instead, you create a single > POJO/Entity, annotate its primary key and pass that object to the cache API > or get it back for read operations. > > As an example, let's assume we have this POJO: > > @IgnitePrimaryKey(fields = {"id", "passportNo"}, affinityKey="id") >> class Person { >> int id; >> String passportNo; >> String name; >> } > > > (the primary key fields must always be annotated so that Ignite could > extract those fields internally). > > Next, if you want to write an object instance into the cache you do this: > > Person personInstance = new Person(5, "23324234", "Thomas"); >> ignite.cache("Person").put(personInstance); > > > To read it back, you just do this > > Person personInstance = ignite.cache("Person").get(5, "23324234"); //the >> method can accept an arbitrary number of fields that define a primary key). > > > > The idea is rough and not finalized but I would like us to explore the > APIs evolution in this direction. > > - > Denis > > > On Thu, May 21, 2020 at 7:19 AM Alexey Kukushkin < > kukushkinale...@gmail.com> wrote: > >> I vote for implementing this enhancement: having key information separated >> from value means either cluttering domain model with >> KeyValue/CacheEntry-like structures or developing an Ignite data access >> layer to insert key info into domain entity after getting it from Ignite. >> >> Although both the options solve the issue, I think the right approach is >> to >> address it in Ignite rather than make all the Ignite users repeatedly deal >> with the issue. It is the Ignite which is a re-usable platform and not >> vise-versa. >> >> >> >> -- >> Sent from: http://apache-ignite-developers.2346864.n4.nabble.com/ >> >