Re: UUIDs

"Jurgen Doll" <[email protected]> Mon, 26 Aug 2024 13:24:45 +0200
Newsgroups gmane.comp.java.cayenne.user
Organization iVory EMR
Message-ID <op.2s3zbjy9y9kazd@admin-pc>
Hi Michael

So Cayenne actually currently does support generating UUID PK's, if in the  
Cayenne Modeler you:

1. set your column type to BINARY
2. set it to a length of 16
3. check the PK flag, and
4. set the table's "PK Generation Strategy" to Cayenne

This will result in a UUID being generated via  
"org.apache.cayenne.util.IDUtil.pseudoUniqueSecureByteSequence(int)".

Unfortunately this UUID is currently a MD5 digest which is bad for  
indexing.

The reason for the digest is to anonymise the underlying UUID which is 16  
bytes long consisting of:
bytes 0..3 - incrementing #
bytes 4..11 - timestamp
bytes 12..15 - IP address

The above UUID generation could easily be changed to use Java's native  
UUID which is a Time-Based UUID that would be index friendly, if I'm not  
mistaken.

Regards
Jurgen


On Sat, 24 Aug 2024 04:42:39 +0200, Michael Gentry <[email protected]>  
wrote:

> Hi Andrus,
>
> Part of what I meant by adding UUID support to Cayenne was to include   
> UUID
> as a PK mechanism in Cayenne modeler and provide a corresponding PK
> generator class. Nothing currently stops you from manually setting a UUID
> yourself, but including support in the modeler would be a more natural  
> fit, I think.
>
> Thanks,
> mrg
>
>
> On Fri, Aug 23, 2024 at 4:33 PM Andrus Adamchik <[email protected]>  
> wrote:
>
>> I am actually glad we went on a tangent and started discussing UUIDs. I
>> just ran into a use-case of an idempotent PUT API endpoint that takes a  
>> mix
>> of new and existing objects, and there's no natural key in the entity to
>> check whether new (PK-less) objects are already in DB (so that we UPDATE
>> them instead of INSERT). UUID would come in handy in this situation :)
>>
>> (FWIW, the endpoint is running on Agrest with Cayenne underneath, and
>> Agrest is the layer that ensures idempotent semantics).
>>
>> Andrus
>>
>>
>> > On Aug 20, 2024, at 12:01 PM, Hugi Thordarson <[email protected]>  
>> wrote:
>> >
>> > 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 <[email protected]> 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 <[email protected]>
>> 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 <[email protected]>  
>> 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 <[email protected]>
>> >>> 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 <
>> [email protected]>
>> >>>>> 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  
>> <[email protected]
>> >
>> >>>>> 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 <
>> [email protected]
>> >>>>
>> >>>>>>> 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 <
>> [email protected]>
>> >>>>>>> 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  
>> <[email protected]>
>> >>>>> wrote:
>> >>>>>>>>>>
>> >>>>>>>>>> Hi Maik,
>> >>>>>>>>>>
>> >>>>>>>>>> Could you provide an example of a failing graph?
>> >>>>>>>>>>
>> >>>>>>>>>> Thanks,
>> >>>>>>>>>> Andrus
>> >>>>>>>>>>
>> >>>>>>>>>>> On Aug 7, 2024, at 7:31 AM, Maik Musall  
>> <[email protected]>
>> >>>>> 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
>> >>>>>
>> >>>>>
>> >>>
>> >>>
>> >
>>
>>


-- 
Using Opera's mail client: http://www.opera.com/mail/