[jira] Created: (CAY-1034) ObjectId key singleValue is byte[]

From: Malcolm Edgar (JIRA) ("Malcolm)
Date: Thu Apr 17 2008 - 06:05:52 EDT

  • Next message: Malcolm Edgar (JIRA): "[jira] Updated: (CAY-1034) ObjectId key singleValue is byte[]"

    ObjectId key singleValue is byte[]
    ----------------------------------

                     Key: CAY-1034
                     URL: https://issues.apache.org/cayenne/browse/CAY-1034
                 Project: Cayenne
              Issue Type: Bug
              Components: Cayenne Core Library
        Affects Versions: 3.0
             Environment: Cayenne 3.0 M3, JDK 1.5.0_15
                Reporter: Malcolm Edgar
                Assignee: Andrus Adamchik

    I have a nasty problem with attempting to perform a refetchObject() on a hollow object. This is the DataObject toString(), note the primary key column 'schema_config_oid' has a value of '..eaf8c>'

    The primary key column of this database is an BIGINT, this table only has one record and its PK value is '1'

    {<ObjectId:SchemaConfig, schema_config_oid=[..eaf8c>; hollow; []}

    When I try to refetchObject(), I get a stacktrace of:

    Caused by: java.sql.SQLException: Cannot convert class [B to SQL type requested due to java.lang.ClassCastException - [B
            at com.mysql.jdbc.PreparedStatement.setObject(PreparedStatement.java:2744)

            at com.mysql.jdbc.PreparedStatement.setObject(PreparedStatement.java:2532)
            at org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.setObject(WrappedPreparedStatement.java:420)
            at org.apache.cayenne.access.types.AbstractType.setJdbcObject(AbstractType.java:79)

            at org.apache.cayenne.access.types.ByteArrayType.setJdbcObject(ByteArrayType.java:191)
            at org.apache.cayenne.dba.JdbcAdapter.bindParameter(JdbcAdapter.java:481)
            at org.apache.cayenne.access.trans.QueryAssembler.initStatement(QueryAssembler.java:123)

            at org.apache.cayenne.access.trans.QueryAssembler.createStatement(QueryAssembler.java:99)
            at org.apache.cayenne.access.jdbc.SelectAction.performAction(SelectAction.java:71)
            at org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:58)

            at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:230)
            ... 60 more

    Some more analysis on this problem the ObjectId singleValue value is a byte[] of the table primary key value "3456", and the ObjectId is returning the raw byte array as the single primary key value.

    This is making a mess of Cayenne refreshing objects, lazy loading, etc.

    I am wondering if this is a JDK 1.5 coercion issue, I have never seen this issue before with JDK 1.4 and Cayenne 1.x.

    A solution to this problem is provided below in the patch to org.apache.cayenne.ObjectId.

    + /**
    + * Creates a portable permanent ObjectId as a compound primary key.
    + *
    + *..aram entityName The entity name which this object id is for
    + *..aram idMap Keys are usually the attribute names for each part of the primary key.
    + * Values are unique when taken as a whole.
    + *..ince 1.2
    + */
    + public ObjectId(String entityName, Map<String, ?> idMap) {
    + this.entityName = entityName;
    +
    + if (idMap == null || idMap.size() == 0) {
    +
    + }
    + else if (idMap.size() == 1) {
    + Map.Entry<String, ?> e = idMap.entrySet().iterator().next();
    + this.singleKey = String.valueOf(e.getKey());
    +
    + if (e.getValue() != null) {
    + Class valueClass = e.getValue().getClass();
    + if (valueClass.isArray()) {
    + if ("byte[]".equals(valueClass.getCanonicalName())) {
    + this.singleValue = new String((byte[]) e.getValue());
    + }
    + }
    + }
    +
    + if (this.singleValue == null) {
    + this.singleValue = e.getValue();
    + }
    + }
    + else {
    +
    + // we have to create a copy of the map, otherwise we may run into
    + // serialization
    + // problems with hessian
    + this.objectIdKeys = new HashMap<String, Object>(idMap);
    + }
    + }

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



    This archive was generated by hypermail 2.0.0 : Thu Apr 17 2008 - 06:09:07 EDT