Hi,
We have a Parent(which has a primitive id) and a child which has composite id. We are trying to use the sql-query and the result-join to get going but are running into
IllegalArgumentException. Here's our mapping:
Parent Mapping
Code:
<hibernate-mapping default-lazy="false">
<class name="com.dbdata.system.dbmeta.DbMeta" table="TAP_DBMETA_ROOT">
<id name="dbMetaId" column="DBMETA_ID" type="integer">
<generator class="assigned"/>
</id>
<property name="name" type="string" column="NAME"/>
<set fetch="join" name="schemas" cascade="all-delete-orphan" inverse="true">
<key column="DBMETA_ID"/>
<one-to-many class="com.dbdata.system.dbmeta.Schema"/>
</set>
<loader query-ref="loadDbMeta"/>
</class>
<sql-query name="loadDbMeta">
<return alias="dbMeta" class="com.dbdata.system.dbmeta.DbMeta"/>
[b]<return-join alias="schema" property="dbMeta.schemas"/>[/b]
SELECT {dbMeta.*},
{schema.*}
FROM DBMETA_ROOT DBMETA
LEFT JOIN DBMETA_SCHEMA SCHEMA
ON DBMETA.DBMETA_ID = SCHEMA.PARENT_DBMETA_ID
WHERE DBMETA.DBMETA_ID = :dbMetaId
</sql-query>
</hibernate-mapping>
Child mappingCode:
<hibernate-mapping default-lazy="false">
<class name="com.dbdata.system.dbmeta.Schema" table="TAP_DBMETA_SCHEMA">
<composite-id name="pkId" class="com.dbdata.system.dbmeta.keys.SchemaID">
<key-property name="dbMetaId" column="DBMETA_ID" type="integer"/>
<key-property name="schemaId" column="SCHEMA_ID" type="integer"/>
</composite-id>
<property name="name" type="string" column="NAME"/>
<many-to-one name="parent" class="com.dbdata.system.dbmeta.DbMeta" column="PARENT_DBMETA_ID" not-null="true"/>
</class>
</hibernate-mapping>
Here's the exception:
Quote:
ERROR 18 Apr 16:07:48 [main] org.hibernate.property.BasicPropertyAccessor - IllegalArgumentException in class: com.dbdata.system.dbmeta.keys.SchemaID, getter method of property: dbMetaId INFO 18 Apr 16:07:48 [main] org.hibernate.event.def.DefaultLoadEventListener - Error performing load command
org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of com.dbdata.system.dbmeta.keys.SchemaID.dbMetaId
at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:171)
at org.hibernate.tuple.AbstractComponentTuplizer.getPropertyValue(AbstractComponentTuplizer.java:121)
at org.hibernate.tuple.AbstractComponentTuplizer.getPropertyValues(AbstractComponentTuplizer.java:133)
at org.hibernate.tuple.PojoComponentTuplizer.getPropertyValues(PojoComponentTuplizer.java:88)
at org.hibernate.type.ComponentType.getPropertyValues(ComponentType.java:307)
at org.hibernate.type.ComponentType.isEqual(ComponentType.java:122)
at org.hibernate.loader.Loader.getKeyFromResultSet(Loader.java:1095)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:554)
at org.hibernate.loader.Loader.doQuery(Loader.java:689)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.doList(Loader.java:2145)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
at org.hibernate.loader.Loader.list(Loader.java:2024)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:111)
at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1674)
at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:147)
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:164)
at org.hibernate.persister.entity.NamedQueryLoader.load(NamedQueryLoader.java:57)
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:2730)
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:365)
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:346)
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:123)
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:161)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87)
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:891)
at org.hibernate.impl.SessionImpl.load(SessionImpl.java:810)
at org.hibernate.impl.SessionImpl.load(SessionImpl.java:803)
at com.dbdata.system.dbmeta.HibernateTester.getObject(HibernateTester.java:45)
at com.dbdata.system.dbmeta.HibernateTester.retrieveObject(HibernateTester.java:87)
at com.dbdata.system.dbmeta.HibernateTester.main(HibernateTester.java:326)
Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:145)
... 29 more
I had a look at the code and at:
Code:
public Object get(Object target) throws HibernateException {
try {
return method.invoke(target,null);
}catch (IllegalArgumentException iae) {
log.error(
"IllegalArgumentException in class: " + clazz.getName() +
", getter method of property: " + propertyName
);
throw new PropertyAccessException(
iae,
"IllegalArgumentException occurred calling",
false,
clazz,
propertyName
); }
Here the
'target' parameter passed to this method is of type Integer (instead of com.dbdata.system.dbmeta.keys.SchemaID) and the method getDbMetaId in invoked on this object of type Integer and hence resulting in the exception.
Does anyone have any idea why this is happening? Anything wrong with the mapping or the query?