openjpa-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Francesco Chicchiriccò <ilgro...@apache.org>
Subject Re: UUID generators worth the effort?
Date Tue, 12 Apr 2016 13:50:58 GMT
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