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.