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
>>>> 
>>>> 
>> 
>> 

Reply via email to