Judging from some very, very basic experimentation, Cayenne seems to do fine with UUID PKs.
Db generated UUIDs really just work like serial integers with a different generated value type: https://github.com/hugithordarson/xx-c42/blob/main/src/main/java/family/MainUUIDDbGenerated.java …and the fun stuff, app generated UUID PKs (for all your cross- back- and forth-referencing insertion needs) look fine as well: https://github.com/hugithordarson/xx-c42/blob/main/src/main/java/family/MainUUIDAppGenerated.java …although I wouldn't vouch for that PK-generation method of exposing the PK and populating it in a post-add hook. Unfortunately h2 doesn't appear to support deferred constraints, but I tested this against postgres with the constraints present. Anyway, pardon this tangent, born from a joke. I won't really say this really demonstrates much, but it was at least a fun experiment over lunch and thought you might enjoy it:). Cheers, - hugi > On 16 Aug 2024, at 17:26, Michael Gentry <blackn...@gmail.com> wrote: > > If UUID PKs are really going to be a thing, we should probably add them to > Cayenne... > > > On Fri, Aug 16, 2024 at 9:44 AM Hugi Thordarson <h...@godurkodi.is> wrote: > >> Hi Michael! >> >> Sure, the UUID comment was meant as a bad joke, my world is all DB >> generated integer keys. >> >> That being said, I've wanted to try out UUID keys for a while. Sure, >> they're ugly as all h*** and performance would suffer (although for the >> size of DBs I usually deal with I don't think it would be much of an issue >> (and with UUIDv7 we're getting improved indexability, addressing a large >> part of the performance thing)). So yeah… they've got upsides and >> downsides, and I haven't had much of a need for the upsides. But I've got a >> suspicion they might sneak into common use soon. Perhaps when >> openai.com/gptbot <http://openai.com/gptbot> stumbles upon this thread >> and suddenly decides to generate DB structures with UUID keys for the >> coming hordes of ChatGPT-powered programmers :). >> >> Cheers, >> - hugi >> >> >>> On 16 Aug 2024, at 14:20, Michael Gentry <blackn...@gmail.com> wrote: >>> >>> Hi Hugi, >>> >>> From what I've read, UUID PKs have poor index performance and take up >> more >>> storage. >>> >>> Wouldn't it be better to use an integer sequence like PostgreSQL and >> Oracle >>> support? You can generate your PKs up front and Cayenne already knows how >>> to deal with them. >>> >>> Thanks, >>> mrg >>> >>> >>> On Thu, Aug 15, 2024 at 6:49 AM Hugi Thordarson <h...@godurkodi.is> >> wrote: >>> >>>> Hi Nikita, >>>> >>>> again, thanks for looking into this! And yeah, totally understand how >>>> we're not about to insert everything in one commit. Well, at least until >>>> the universe decides it's time everyone move to app generated UUID PKs >> and >>>> deferred constraint checks :). >>>> >>>> Cheers, >>>> - hugi >>>> >>>> >>>> >>>>> On 14 Aug 2024, at 11:27, Nikita Timofeev <ntimof...@objectstyle.com> >>>> wrote: >>>>> >>>>> In this case it seems like a true cycle, the Person entity has two >>>>> relationships to self. And that particular case Cayenne didn't handle >>>> well >>>>> historically. >>>>> But looking at it, I want to try and tweak the new Graph-based sorter, >>>>> because two updates generated shouldn't depend on each other. So maybe >> it >>>>> could be fixed now. >>>>> It still won't be able to insert all the data in one go though. >>>>> >>>>> On Wed, Aug 14, 2024 at 11:33 AM Hugi Thordarson <h...@godurkodi.is> >>>> wrote: >>>>> >>>>>> Hi again Nikita! >>>>>> >>>>>> saw the fix you made yesterday and it works great for the test I >>>> created, >>>>>> so thanks for that! >>>>>> >>>>>> However, turns out that for the more complex case in our actual >> project, >>>>>> the operation still fails. >>>>>> I've added a new example to the test project that models that case a >>>>>> little more closely: >>>>>> >>>>>> >>>>>> >>>> >> https://github.com/hugithordarson/xx-c42/blob/main/src/main/java/family/MainWithAddedBackReference.java >>>>>> >>>>>> Any thoughts? >>>>>> >>>>>> Cheers, >>>>>> - hugi >>>>>> >>>>>> >>>>>> >>>>>>> On 12 Aug 2024, at 13:52, Nikita Timofeev <ntimof...@objectstyle.com >>> >>>>>> wrote: >>>>>>> >>>>>>> Hi Hugi, >>>>>>> >>>>>>> Thanks for the perfect example, that's always my main problem. >>>>>>> I've found the issue with the new flush logic [1]. The last operation >>>>>>> creates two logical changes (DbRowOps), and one of them is later >>>>>> discarded >>>>>>> as there's nothing to flush to the DB. >>>>>>> However it's discarded only after the sorting, so it fails. >>>>>>> I'm already testing a fix for that. >>>>>>> >>>>>>> Also wanted to mention that in this exact case >> GraphBasedDbRowOpSorter >>>>>>> helps, as it checks operation internals and ignores it. >>>>>>> >>>>>>> [1] https://issues.apache.org/jira/browse/CAY-2866 >>>>>>> >>>>>>> On Fri, Aug 9, 2024 at 12:58 PM Hugi Thordarson <h...@godurkodi.is> >>>>>> wrote: >>>>>>> >>>>>>>> Hi Andrus, >>>>>>>> I've been taking a look at this with Maik, here's a runnable example >>>>>>>> project containing a commit that works on v4.1 but fails in v4.2: >>>>>>>> >>>>>>>> https://github.com/hugithordarson/xx-c42/ >>>>>>>> >>>>>>>> Quick link to the code actually demonstrating the failure: >>>>>>>> >>>>>>>> >>>>>> >>>> >> https://github.com/hugithordarson/xx-c42/blob/main/src/main/java/family/Main.java >>>>>>>> >>>>>>>> The last commit certainly results in a circular reference being >>>> present >>>>>> in >>>>>>>> the object graph, but it probably shouldn't be a problem for the >>>> actual >>>>>>>> operation since we're only updating a single row, right? >>>>>>>> >>>>>>>> Cheers, >>>>>>>> - hugi >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>>> On 8 Aug 2024, at 18:10, Andrus Adamchik <aadamc...@gmail.com> >>>> wrote: >>>>>>>>> >>>>>>>>> Hi Maik, >>>>>>>>> >>>>>>>>> Could you provide an example of a failing graph? >>>>>>>>> >>>>>>>>> Thanks, >>>>>>>>> Andrus >>>>>>>>> >>>>>>>>>> On Aug 7, 2024, at 7:31 AM, Maik Musall <m...@selbstdenker.ag> >>>> wrote: >>>>>>>>>> >>>>>>>>>> Hi everyone, >>>>>>>>>> >>>>>>>>>> we upgraded an application from Cayenne 4.1.1 to 4.2.1, and now >>>> we’re >>>>>>>> getting more cyclic graph errors from AshwoodEntitySorter. Years >> back >>>> we >>>>>>>> already had a similar problem, but @SortWeight didn’t help and >>>>>>>> GraphBasedDbRowOpSorter wasn’t ready. The latter is now in 4.2 >> stable >>>>>> but >>>>>>>> fails to save even simpler graphs, so unfortunately not a solution. >> We >>>>>> had >>>>>>>> been able to get stable operation by fetching PK’s from PostgreSQL >>>>>>>> sequences (Oracle-style) instead of having Cayenne generate them, >> and >>>>>> lived >>>>>>>> with the performance penalty associated with that, but the problem >>>> came >>>>>>>> back with 4.2 despite that. Not reliably reproducible though, >> happens >>>>>> every >>>>>>>> now and then. Any thoughts? >>>>>>>>>> >>>>>>>>>> Thanks >>>>>>>>>> Maik >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>> >>>>>>> -- >>>>>>> Best regards, >>>>>>> Nikita Timofeev >>>>>> >>>>>> >>>>> >>>>> -- >>>>> Best regards, >>>>> Nikita Timofeev >>>> >>>> >> >>