Todd -

Honestly, I don't have much experience in this area. If you are able to put
together a small unit test I'll try to take a look when I get some time.

Thanks,
Rick


On Wed, Mar 19, 2014 at 10:05 PM, Todd Nine <t...@spidertracks.com> wrote:

> Just to follow up my own email, my configuration in the persistence XML
> does work as expected.  However, I'm receiving this error.
>
> Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException: BLOB/TEXT
> column 'id' used in key specification without a key length {stmnt 992554479
> CREATE TABLE AlertAcknowlege (id BLOB NOT NULL, createTime DATETIME,
> imeiNumber VARCHAR(255), queuedDate DATETIME, statusCode INTEGER, DTYPE
> VARCHAR(255), PRIMARY KEY (id)) ENGINE = innodb} [code=1170, state=42000]
>  at
>
> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:247)
>
>
> Here is my mapping class.
>
> **
>  * The value handler for converting com.eaio.uuid.UUID objects to byte
> arrays.
>  *
>  *
>  * @author Todd Nine
>  */
> public class UUIDValueHandler extends ByteArrayValueHandler {
>
>     @Override
>     public Object toDataStoreValue(ValueMapping vm, Object val, JDBCStore
> store) {
>
>         final byte[] data = UUIDSerializer.toBytes((com.eaio.uuid.UUID)
> val);
>
>         return super.toDataStoreValue(vm, data, store);
>
>     }
>
>
>     @Override
>     public Object toObjectValue(ValueMapping vm, Object val) {
>         byte[] data = (byte[]) val;
>
>         final UUID uuid = UUIDSerializer.fromBytes(data);
>
>         return uuid;
>     }
>
>     @Override
>     public Column[] map(ValueMapping vm, DBIdentifier name, ColumnIO io,
> boolean adapt) {
>
>         Column col = new Column();
>         col.setIdentifier(name);
>         col.setJavaType(JavaSQLTypes.BYTES);
>         //we should always be binary 16 for the uuid
>         col.setType(Types.BINARY);
>         col.setSize(UUIDSerializer.LENGTH);
>
>         return new Column[]{ col };
>     }
>
>
> }
>
> As you can see on the type, I'm definitely setting the type to binary, and
> the length to 16 for every UUID type I encounter.  Am I doing this
> incorrectly for the schema generation to work properly?
>
> Thanks,
> Todd
>
>
> On 19 March 2014 18:56, Todd Nine <t...@spidertracks.com> wrote:
>
> > Thanks for the reply Rick.  That does the trick for one field, but this
> > class is used heavily throughout the model.  If possible I'd like to
> create
> > a custom field mapping, so that every time a UUID is encountered, this
> > mapping happens automatically.    I've created a custom field mapping.
> >
> > public class UUIDValueHandler extends ByteArrayValueHandler {
> >
> >     @Override
> >     public Object toDataStoreValue(ValueMapping vm, Object val, JDBCStore
> > store) {
> >
> >         final byte[] data = UUIDSerializer.toBytes((com.eaio.uuid.UUID)
> > val);
> >
> >         return super.toDataStoreValue(vm, data, store);
> >
> >     }
> >
> >
> >     @Override
> >     public Object toObjectValue(ValueMapping vm, Object val) {
> >         byte[] data = (byte[]) val;
> >
> >         final UUID uuid = UUIDSerializer.fromBytes(data);
> >
> >         return uuid;
> >     }
> > }
> >
> > However, it's not clear to me how to configure this as a plugin via the
> > JPA configuration.  I searched through the documentation, but I can't
> find
> > any examples for how to do this.  I referenced this section.
> >
> >
> >
> http://ci.apache.org/projects/openjpa/trunk/docbook/manual.html#ref_guide_mapping_custom_field_conf
> >
> > However when I navigate to the reference of section 4 it takes me to this
> > section.
> >
> >
> >
> http://ci.apache.org/projects/openjpa/trunk/docbook/manual.html#ref_guide_mapping_defaults
> >
> > Should I define a property as follows?
> >
> > <property name="openjpa.jdbc.MappingDefaults"
> >
> value="FieldStrategies='com.eaio.uuid.UUID=com.spidertracks.aviator.dataaccess.jpa.mysql.UUIDValueHandler'"/>
> >
> >
> >
> > On 19 March 2014 08:56, Rick Curtis <curti...@gmail.com> wrote:
> >
> >> Todd -
> >>
> >> Take a look at @Externalizer/@Factory in the user manual[1]. Below is a
> >> snippet of code where I have a String field in my Entity, but the
> backing
> >> column in the DB is an int. The Externalizer/Factory methods convert
> >> values
> >> from/to the database. Let me know how this goes.
> >>
> >> Thanks,
> >> Rick
> >>
> >>     @Id
> >>
> >>
> >>
> @Externalizer("org.apache.openjpa.persistence.kernel.common.apps.RuntimeTest1.toDb")
> >>
> >>
> >>
> @Factory("org.apache.openjpa.persistence.kernel.common.apps.RuntimeTest1.fromDb")
> >>     private String intField;
> >>
> >>     public static int toDb(String val){
> >>         return Integer.valueOf(val);
> >>     }
> >>
> >>     public static String fromDb(int val) {
> >>         return String.valueOf(val);
> >>     }
> >>
> >> [1]
> >>
> >>
> http://ci.apache.org/projects/openjpa/trunk/docbook/manual.html#ref_guide_pc_extern
> >>
> >>
> >> On Wed, Mar 19, 2014 at 12:10 AM, Todd Nine <t...@spidertracks.com>
> >> wrote:
> >>
> >> > Hi all,
> >> >  We're migrating from a Key/Value system to MySQL for some components
> of
> >> > our system for easier administration and maintenance.  As part of this
> >> > migration, we need to retain the time UUIDs that have been generated
> for
> >> > primary keys.  I'm having a hard time mapping this.  I have the
> >> following.
> >> >
> >> > @Id
> >> > @Column( columnDefinition = "BINARY(16)", length = 16 )
> >> > private UUID id;
> >> >
> >> > However this always seems to fail.  I'm on the latest MySQL version
> >> 5.6.16
> >> > GA and Open JPA 2.2.2 I've found this old thread, but it's not quite
> >> what
> >> > I'm looking for.  I'm really struggling to find the documentation on
> >> how to
> >> > declare and implement custom type converters. Converting a UUID to a
> >> binary
> >> > array of length 16 is trivial, as is creating a new UUID instance from
> >> > those bytes.  I'm just not sure how to plug in to the JPA framework to
> >> make
> >> > it happen.  Any advice would be greatly appreciated.
> >> >
> >> > Thanks,
> >> > Todd
> >> >
> >>
> >>
> >>
> >> --
> >> *Rick Curtis*
> >>
> >
> >
>



-- 
*Rick Curtis*

Reply via email to