FYI I finally decided to follow your suggestion and stick with UUID values as String - CHAR(36).

I was a bit scared of the perspective of being forced to extend all DBDictionary classes for the various DBMSes we support, after having almost completed the work for H2 - that in theory should have been one of the easiest, having a UUID native type available.
So I reverted the H2 extended DBDictionary and I am now almost done.

Ah, the patch in OPENJPA-2640 is still needed, otherwise I cannot use my custom Sequence Generator with the Maven plugin.

Regards.

On 13/04/2016 08:53, Mark Struberg wrote:
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