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*
>>
>
>

Reply via email to