You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by "Pinaki Poddar (JIRA)" <ji...@apache.org> on 2010/06/05 19:03:54 UTC

[jira] Created: (OPENJPA-1683) Why string encoding of OpenJPA Identity instances for LongId differes from other built-in identity types?

Why string encoding of OpenJPA Identity instances for LongId differes from other built-in identity types?
---------------------------------------------------------------------------------------------------------

                 Key: OPENJPA-1683
                 URL: https://issues.apache.org/jira/browse/OPENJPA-1683
             Project: OpenJPA
          Issue Type: Bug
          Components: kernel
            Reporter: Pinaki Poddar
            Assignee: Pinaki Poddar
             Fix For: 2.1.0


How the built-in classes for persistent identity value encodes as itself as a String is critical/significant -- because 
a) the encoded string often is decoded to extract the original value for instance look up
b) for untyped persistence capable instances, the encoded string carries the actual class name -- and hence is important to instantiate the actual instance during loading from database

Unfortunately, this important decision about encoding-decoding of identity value is *not* emphasized with methods such as encode()/decode() on OpenJPAId but encoding is done with ubiquitous Object.toString() and decoding is burried in code lines.  
  
While it is perhaps important to review this scheme, the immediate issue at hand is somewhat narrower and as follows:

  The root *abstract* class OpenJPAId has the following toString() implementation
    public String toString() {
        return type.getName() + "-" + getIdObject();
    }
   
   The concrete implementation such as IntId or FloatId overwrites this behavior as follows:

    IntId.java:
           private final int key;

    public String toString() {
        return String.valueOf(key);
    }

   FloatId.java:
           private final float key;
    public String toString() {
        return Float.toString(key);
    }

  Apart from the subtle difference (but why), they look to be following the same principle, i.e. just stringify the value.

  But the interesting part is LongId *does not* have a toString() method.
  Hence its toString() form is dictated by its abstract super class OpenJPAId which appends the class name with a dash character to the actual long value of the identity.

  I can not figure out the reason of this anomaly  for long identifier as opposed to other Short/Integer or Float etc.
  The risk  of simply adding a toString() to LongId that is in line with other id types, of course, a) breaking any existing application that may be assuming the previous  encoding
b) the unknown original reason behind *not* overwriting LongId.toString() method

   Can someone please, please answer/shed some light? 

   It is critical for some direction I am pursuing to support generic/templated types where exact types are not determinable at compile/design time.

   Without an answer, I will commit the change on LongId to have a toString() method. 
+
+    public String toString() {
+        return String.valueOf(key);
+    }





-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.