openjpa-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Mark Struberg <strub...@yahoo.de.INVALID>
Subject Re: UUID generators worth the effort?
Date Tue, 12 Apr 2016 14:11:32 GMT
> you are not interested in making the approach below more general - 

'not interested' is not the right word. Not on my personal list of important things for me
personal - but happy to get patches!

> 4. I have opened OPENJPA2640 and provided a patch
Thanks a lot, trying to get around it the next days. Feel free to poke me for it ;)

txs and LieGrue,
strub




> On Tuesday, 12 April 2016, 15:51, Francesco Chicchiriccò <ilgrosso@apache.org>
wrote:
> > Hi Mark,
> with reference to my 4 questions below:
> 
> 1. I have experimented that, even though UUIDType4HexSeq provides a 
> static getInstance() method, it is not called with my use case, so I am 
> fine with my UUIDGenerator's constructor being invoked twice (e.g. one 
> time for each entity)
> 
> 2. I have been able to translate the sequence generator definition to 
> orm.xml
> 
> 3. I understand that since "some DBs are not really working with it", 
> you are not interested in making the approach below more general - 
> that's fine, we are going to use it anyway, for the DBs we support
> 
> 4. I have opened OPENJPA2640 and provided a patch, please take a look - 
> incidentally, I have noticed that 2.4.1 appears as unreleased in JIRA
> 
> Regards.
> 
> 
> On 12/04/2016 09:22, Mark Struberg wrote:
>>  Hi Francesco!
>> 
>>  I usually let the PK be a String and create the UUID myself in Java.
>> 
>>  The 'uuid' generator is a nice feature but it's not portable.
>> 
>>  And that might be the reason why some DBs are not really working with it - 
> it's simply not that frequently used.
>> 
>> 
>>  There are 3 ways to create the UUID.
>> 
>>  a.) In the default ct. That might trigger a tad too often and might slow 
> down selects, etc.
>>  b.) Lazily in getId(). If null -> create a new UUID
>>  c.) Via an own ct which takes the UUID pk. You basically create the ID in 
> your business layer.
>> 
>>  I mostly use c) if I need a UUID pk.
>> 
>>  LieGrue,
>>  strub
>> 
>> 
>> 
>> 
>>>  On Monday, 11 April 2016, 9:02, Francesco Chicchiriccò 
> <ilgrosso@apache.org> wrote:
>>>>  Hi all,
>>>  I went further and built a sample POC [10] which mimics the essentials
>>>  from Syncope.
>>> 
>>>  I have defined an UUIDGenerator implementing Seq (and relying on [3] 
> for
>>>  UUID generation), and declared it via
>>> 
>>>  @SequenceGenerator(name = "uuid", sequenceName =
>>>  "net.tirasa.ilgrosso.uuidpoc.openjpa.UUIDGenerator()")
>>> 
>>>  in the @MappedSuperclass of both JPA entities available, plus defined
>>> 
>>>        @Id
>>>        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator =
>>>  "uuid")
>>>        private UUID id;
>>> 
>>>  in both entities.
>>> 
>>>  I have also extended the H2Dictionary to support the native UUID type
>>>  (without such extension, the id column would have had type BLOB).
>>> 
>>>  All this above seems to work - at least for the simple JUnit test case
>>>  provided; I have some questions, though:
>>> 
>>>  1. I have experimented that UUIDGenerator is instantiated twice: would
>>>  it be possible to defined it as singleton - as it happens for 
> OpenJPA's
>>>  UUIDType4HexSeq?
>>> 
>>>  2. How would the @SequenceGenerator annotation translates to orm.xml?
>>>  I've attempted the bare translation but it did not work.
>>> 
>>>  3. The extended logic I have put in my H2Dictionary looks quite poor 
> for
>>>  the general case - even though good enough for my specific use case:
>>> 
>>>        @Override
>>>        public String getTypeName(final Column col) {
>>>            return col.getType() == Types.BLOB && 
> (col.isPrimaryKey() ||
>>>  col.isForeignKey())
>>>                    ? "UUID"
>>>                    : super.getTypeName(col);
>>>        }
>>> 
>>>  How much difficult would be to make it proper, e.g. recognize when the
>>>  class field is java.util.UUID? I'll need such extension for MySQL,
>>>  MariaDB, PostgreSQL, MS SQL Server and Oracle dictionaries.
>>> 
>>>  4. I am used to rely on openjpa-maven-plugin to generate the
>>>  database.sql file; how can I configure it to use my H2Dictionary, and
>>>  not the default?
>>> 
>>>  Thanks for your support.
>>>  Regards.
>>> 
>>>  On 04/04/2016 10:49, Francesco Chicchiriccò wrote:
>>>>    Hi all,
>>>>    in Syncope we are currently discussing [1] the option to replace 
> our
>>>>    table generators-based id strategy to something else, based on 
> UUID,
>>>>    which seem to offer several advantages.
>>>> 
>>>>    I have found [2], but I would rather prefer to generated UUID 
> values
>>>>    manually (via [3] which seems to offer better performance and 
> more
>>>>    features than the standard JDK's).
>>>> 
>>>>    In order to do so, I would replace the current
>>>> 
>>>>        @Id
>>>>        private Long id;
>>>> 
>>>>        public Long getKey() {
>>>>            return id;
>>>>        }
>>>> 
>>>>    in  [4], backed by [5], with something like as
>>>> 
>>>>    @Id
>>>>    private UUID id;
>>>> 
>>>>    public UUID getKey() {
>>>>      synchronized(this) {
>>>>        if (key == null) {
>>>>          key = ... // generate via JUG [3]
>>>>        }
>>>>      }
>>>>      return key;
>>>>    }
>>>> 
>>>>    As Syncope supports several DBMSes, I would also like to empower 
> the
>>>>    underlying capabilities for storing such values:
>>>> 
>>>>     * UUID Type for PostgreSQL [6]
>>>>     * UNIQUEIDENTIFIER for SQL Server [7]
>>>>     * RAW(16) for Oracle [8]
>>>>     * BINARY(16) with some optimizations for MySQL / MariaDB [9] or
>>>>    vanilla with H2
>>>> 
>>>>    Do you have any suggestion about:
>>>> 
>>>>     (a) the way how I am planning to support UUID generation
>>>>     (b) the cleanest way to support DBMS differences (extending the
>>>>    respective DB dictionaries?)
>>>> 
>>>>    TIA
>>>>    Regards.
>>>> 
>>>>    [1] http://markmail.org/message/fhdrwerdwdm3opdx
>>>>    [2]
>>>> 
>>> 
> http://openjpa.apache.org/builds/2.4.1/apache-openjpa/docs/jpa_overview_meta_field.html#jpa_overview_meta_gen
>>>>    [3] https://github.com/cowtowncoder/java-uuid-generator
>>>>    [4]
>>>> 
>>> 
> https://github.com/apache/syncope/blob/master/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java
>>>>    [5]
>>>> 
>>> 
> https://github.com/apache/syncope/blob/master/core/persistence-jpa/src/main/resources/META-INF/spring-orm.xml#L87-L94
>>>>    [6] http://www.postgresql.org/docs/9.3/static/datatype-uuid.html
>>>>    [7]
>>>>   
> http://wiki.ispirer.com/sqlways/sql-server/data-types/uniqueidentifier
>>>>    [8]
>>>> 
>>> 
> http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions175.htm#SQLRF51816
>>>>    [9] 
> https://www.percona.com/blog/2014/12/19/store-uuid-optimized-way/
>>>  [10] https://github.com/ilgrosso/OpenJPAUUIDPOC
> 
> -- 
> Francesco Chicchiriccò
> 
> Tirasa - Open Source Excellence
> http://www.tirasa.net/
> 
> Involved at The Apache Software Foundation:
> member, Syncope PMC chair, Cocoon PMC, Olingo PMC, CXF committer
> http://home.apache.org/~ilgrosso/
>

Mime
View raw message