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