I'm using a custom ValueHandler to convert a numeric value in the
database to a Joda DateTime.  I'm getting a ClassCastException when I
use the @Strategy on column.  If I remove the strategy off of the
numeric date field, the record is loaded correctly.  Any help or
insight would be helpful.

java.lang.ClassCastException: org.joda.time.DateMidnight cannot be
cast to org.apache.openjpa.util.ObjectId
        at com.company.product.Entity.pcCopyKeyFieldsToObjectId(Entity.java)
        at 
org.apache.openjpa.enhance.PCRegistry.copyKeyFieldsToObjectId(PCRegistry.java:167)
        at 
org.apache.openjpa.util.ApplicationIds.fromPKValues(ApplicationIds.java:224)
        at 
org.apache.openjpa.jdbc.meta.ClassMapping.getObjectId(ClassMapping.java:219)
        at 
org.apache.openjpa.jdbc.meta.ClassMapping.getObjectId(ClassMapping.java:147)
        at 
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.load(JDBCStoreManager.java:1031)
        at 
org.apache.openjpa.jdbc.sql.AbstractResult.load(AbstractResult.java:280)
        at 
org.apache.openjpa.jdbc.sql.SelectImpl$SelectResult.load(SelectImpl.java:2381)
        at 
org.apache.openjpa.jdbc.meta.strats.RelationToManyInverseKeyFieldStrategy.loadElement(RelationToManyInverseKeyFieldStrategy.java:90)
        at 
org.apache.openjpa.jdbc.meta.strats.RelationCollectionInverseKeyFieldStrategy.loadElement(RelationCollectionInverseKeyFieldStrategy.java:76)
        at 
org.apache.openjpa.jdbc.meta.strats.StoreCollectionFieldStrategy.load(StoreCollectionFieldStrategy.java:558)
        at org.apache.openjpa.jdbc.meta.FieldMapping.load(FieldMapping.java:934)
        at 
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.load(JDBCStoreManager.java:702)
        at 
org.apache.openjpa.kernel.DelegatingStoreManager.load(DelegatingStoreManager.java:117)
        at 
org.apache.openjpa.kernel.ROPStoreManager.load(ROPStoreManager.java:78)

@Entity
@IdClass(EntityKey.class)
public class Entity
        implements Serializable
{
        @Id
        @Column(name="ENTITY_CODE")
        private String code;

        @Id
        @Column(name="EFFDATE")
        @Strategy("com.company.product.NumericDateValueHandler")
        private DateMidnight effectiveDate;
        
}

public class EntityKey
{
        private String code;
        private DateMidnight effectiveDate;
}

public class NumericDateValueHandler
        implements ValueHandler
{
        private static final long serialVersionUID = 8355414495623865366L;

        public Column[] map(ValueMapping vm, String name, ColumnIO io, boolean 
adapt) {
                DBDictionary dict = vm.getMappingRepository().getDBDictionary();
                DBIdentifier colName = DBIdentifier.newColumn(name, dict != 
null ?
dict.delimitAll() : false);

                Column column = new Column();
                column.setIdentifier(colName);
                column.setType(Types.DECIMAL);
                column.setJavaType(JavaTypes.INT);
                column.setSize(-1);
                return new Column[]{column};
        }

        public boolean isVersionable(ValueMapping vm) {
                return false;
        }

        public boolean objectValueRequiresLoad(ValueMapping vm) {
                return false;
        }

        public Object getResultArgument(ValueMapping vm) {
                return null;
        }

        public Object toDataStoreValue(ValueMapping vm, Object val, JDBCStore 
store) {
                return toDataStoreValue(vm, (DateMidnight)val, store);
        }
        
        public Integer toDataStoreValue(ValueMapping vm, DateMidnight value,
JDBCStore store)
        {
                if(value == null)
                {
                        return null;
                }
                
                int cyymmddValue = DateUtils.toNumeric(value);
                return cyymmddValue;
        }

        public Object toObjectValue(ValueMapping vm, Object val) {
                return toObjectValue(vm, (Integer)val);
        }

        public Object toObjectValue(ValueMapping vm, Object val,
                        OpenJPAStateManager sm, JDBCStore store,
                        JDBCFetchConfiguration fetch) throws SQLException {
                return toObjectValue(vm, (Integer)val);
        }
        
        public DateMidnight toObjectValue(ValueMapping vm, Integer value)
        {
                if(value == null || value < 1)
                 {
                         return null;
                }

                return DateUtils.fromNumeric(value);

        }
}

Reply via email to