For the application it's a String. JPA doesn't need to know whether this String 
represents a uuid or a random number you did yourself. It just needs to be 
unique!

LieGrue,
strub






> On Tuesday, 12 April 2016, 17:08, Francesco Chicchiriccò 
> <ilgro...@apache.org> wrote:
> > On 12/04/2016 16:11, Mark Struberg wrote:
>>>  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!
> 
> Sure :-)
> But then I need some hint in finding how to recognize when the mapped 
> field is java.util.UUID (rather than String).
> 
>>>  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 ;)
> 
> Perfect, thanks.
> Regards.
> 
> 
>>>  On Tuesday, 12 April 2016, 15:51, Francesco Chicchiriccò 
> <ilgro...@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ò
>>>  <ilgro...@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/
>

Reply via email to