You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by Ate Douma <at...@douma.nu> on 2004/04/23 01:54:38 UTC
Jetspeed-2: Cannot get FieldConversion working on autoIncrement field
Hello,
I'm trying to get the OJB model for Jetspeed 2 working against an Oracle
database (9.2.0.1).
Up until now the model was only used against HSQLDB. After trying to
switch to Oracle a few blocking issues were encountered which we didn't
notice when using HSQLDB.
One of these is that for a PK of a table we use a custom object which is
mapped onto a INTEGER field in the database. That field also has
autoincrement=true.
On HSQLDB we didn't have a FieldConversion defined for the object which
strangly does work (HSQLDB probably *fixes* this error with new
Integer(object.toString())).
On Oracle it throwed correctly a ClassCastException (by the Oracle jdbc
driver).
So now we defined the FieldConversion but were confronted with another
exception: IllegalArgumentException from
sun.reflect.UnsafeIntegerFieldAccessorImpl.set (see below).
The field definition looks like this:
<field-descriptor
name="id"
column="APPLICATION_ID"
jdbc-type="INTEGER"
primarykey="true"
autoincrement="true"
conversion="org.apache.jetspeed.util.ojb.ObjectIDtoLongFieldConversion"
/>
and the FieldConvertion is as follows:
public class ObjectIDtoLongFieldConversion implements FieldConversion
{
public Object javaToSql(Object arg0) throws ConversionException
{
if (arg0 instanceof JetspeedObjectID)
{
JetspeedObjectID oid = (JetspeedObjectID) arg0;
return new Integer(oid.intValue());
}
else
{
return arg0;
}
}
public Object sqlToJava(Object arg0) throws ConversionException
{
if (arg0 instanceof Number)
{
return new JetspeedObjectID(((Number)arg0).intValue());
}
else
{
return arg0;
}
}
}
When running a unit test we get the following errors:
[PersistentField] ERROR: while set field:
[try to set 'object value' in 'target object'
target obj class:
org.apache.jetspeed.om.portlet.impl.PortletApplicationDefinitionImplid
target field type: int
object value class: org.apache.jetspeed.util.JetspeedObjectID
object value: 41
]
null
------------- ---------------- ---------------
------------- Standard Error -----------------
java.lang.IllegalArgumentException
at
sun.reflect.UnsafeIntegerFieldAccessorImpl.set(UnsafeIntegerFieldAccessorImpl.java:80)
at java.lang.reflect.Field.set(Field.java:519)
at
org.apache.ojb.broker.metadata.fieldaccess.PersistentFieldDirectAccessImpl.doSet(PersistentFieldDirectAccessImpl.java:71)
at
org.apache.ojb.broker.metadata.fieldaccess.AbstractPersistentField.set(AbstractPersistentField.java:98)
at
org.apache.ojb.broker.util.BrokerHelper.getAutoIncrementValue(BrokerHelper.java:302)
at
org.apache.ojb.broker.util.BrokerHelper.getValuesForObject(BrokerHelper.java:345)
at
org.apache.ojb.broker.util.BrokerHelper.getKeyValues(BrokerHelper.java:171)
at org.apache.ojb.broker.Identity.init(Identity.java:118)
at org.apache.ojb.broker.Identity.<init>(Identity.java:87)
at
org.apache.ojb.broker.core.PersistenceBrokerImpl.store(PersistenceBrokerImpl.java:679)
at
org.apache.ojb.broker.core.DelegatingPersistenceBroker.store(DelegatingPersistenceBroker.java:174)
at
org.apache.ojb.broker.core.DelegatingPersistenceBroker.store(DelegatingPersistenceBroker.java:174)
at
org.apache.jetspeed.components.persistence.store.ojb.pb.PBStore.store(PBStore.java:362)
at
org.apache.jetspeed.components.persistence.store.ojb.pb.PBStore.makePersistent(PBStore.java:346)
at
org.apache.jetspeed.components.portletentity.TestPortletEntityAccessComponent.setupTestData(TestPortletEntityAccessComponent.java:162)
at
org.apache.jetspeed.components.portletentity.TestPortletEntityAccessComponent.setUp(TestPortletEntityAccessComponent.java:66)
at junit.framework.TestCase.runBare(TestCase.java:125)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at
org.apache.jetspeed.components.ComponentAwareTestSuite.runTest(ComponentAwareTestSuite.java:141)
at junit.framework.TestSuite.run(TestSuite.java:203)
at
org.apache.jetspeed.components.ComponentAwareTestSuite.run(ComponentAwareTestSuite.java:108)
at
org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:325)
at
org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:536)
------------- ---------------- ---------------
Testcase: testEntities took 0.75 sec
Caused an ERROR
Can not init Identity for given object
org.apache.jetspeed.om.portlet.impl.PortletApplicationDefinitionImpl@1d2b9b7
org.apache.ojb.broker.metadata.ClassNotPersistenceCapableException: Can
not init Identity for given object
org.apache.jetspeed.om.portlet.impl.PortletApplicationDefinitionImpl@1d2b9b7
at org.apache.ojb.broker.Identity.init(Identity.java:125)
at org.apache.ojb.broker.Identity.<init>(Identity.java:87)
at
org.apache.ojb.broker.core.PersistenceBrokerImpl.store(PersistenceBrokerImpl.java:679)
at
org.apache.ojb.broker.core.DelegatingPersistenceBroker.store(DelegatingPersistenceBroker.java:174)
at
org.apache.ojb.broker.core.DelegatingPersistenceBroker.store(DelegatingPersistenceBroker.java:174)
at
org.apache.jetspeed.components.persistence.store.ojb.pb.PBStore.store(PBStore.java:362)
at
org.apache.jetspeed.components.persistence.store.ojb.pb.PBStore.makePersistent(PBStore.java:346)
at
org.apache.jetspeed.components.portletentity.TestPortletEntityAccessComponent.setupTestData(TestPortletEntityAccessComponent.java:162)
at
org.apache.jetspeed.components.portletentity.TestPortletEntityAccessComponent.setUp(TestPortletEntityAccessComponent.java:66)
at
org.apache.jetspeed.components.ComponentAwareTestSuite.runTest(ComponentAwareTestSuite.java:141)
at
org.apache.jetspeed.components.ComponentAwareTestSuite.run(ComponentAwareTestSuite.java:108)
Caused by: org.apache.ojb.broker.PersistenceBrokerException: Error while
trying to autoincrement field class
org.apache.jetspeed.om.portlet.impl.PortletApplicationDefinitionImpl#id
at
org.apache.ojb.broker.util.BrokerHelper.getAutoIncrementValue(BrokerHelper.java:307)
at
org.apache.ojb.broker.util.BrokerHelper.getValuesForObject(BrokerHelper.java:345)
at
org.apache.ojb.broker.util.BrokerHelper.getKeyValues(BrokerHelper.java:171)
at org.apache.ojb.broker.Identity.init(Identity.java:118)
... 19 more
Caused by: org.apache.ojb.broker.metadata.MetadataException: Error
setting field:id in
object:org.apache.jetspeed.om.portlet.impl.PortletApplicationDefinitionImpl
at
org.apache.ojb.broker.metadata.fieldaccess.PersistentFieldDirectAccessImpl.doSet(PersistentFieldDirectAccessImpl.java:88)
at
org.apache.ojb.broker.metadata.fieldaccess.AbstractPersistentField.set(AbstractPersistentField.java:98)
at
org.apache.ojb.broker.util.BrokerHelper.getAutoIncrementValue(BrokerHelper.java:302)
... 22 more
Caused by: java.lang.IllegalArgumentException
at
sun.reflect.UnsafeIntegerFieldAccessorImpl.set(UnsafeIntegerFieldAccessorImpl.java:80)
at java.lang.reflect.Field.set(Field.java:519)
at
org.apache.ojb.broker.metadata.fieldaccess.PersistentFieldDirectAccessImpl.doSet(PersistentFieldDirectAccessImpl.java:71)
... 24 more
Now, I have been looking long and hard at the code in BrokerHelper but I
don't have a real understanding whats going on.
As far as I can tell the generated id value has been converted to our
JetspeedObjectID correctly but then OJB tries to set that back into the
persistentField without converting it back (or maybe I got this the
wrong way around).
We would very much appriciate any help because this really is a Blocking
situation for us.
If possible please report back on this to the Jetspeed dev list
(jetspeed-dev@jakarta.apache.org) and/or directly to me: ate@douma.nu as
I'm currently not subscribed to the ojb list.
Regards,
Ate Douma
---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org