[
https://issues.apache.org/cayenne/browse/CAY-1034?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Malcolm Edgar updated CAY-1034:
-------------------------------
Attachment: ObjectId.java
The method : public ObjectId(String entityName, Map<String, ?> idMap) has
been updated, byte array test appears a bit klunky, not sure how else to do
this.
> 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
> Attachments: ObjectId.java
>
>
> 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 '[EMAIL PROTECTED]>'
> The primary key column of this database is an BIGINT, this table only has one
> record and its PK value is '1'
> {<ObjectId:SchemaConfig, [EMAIL PROTECTED]>; 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.
> + *
> + * @param entityName The entity name which this object id is for
> + * @param idMap Keys are usually the attribute names for each part of
> the primary key.
> + * Values are unique when taken as a whole.
> + * @since 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.