seshubabuarava (1) [Avatar] Offline
#1
I have a scenario where the foreignkey in the child table references a part of primarykey in the parent table which is also unique. This is an existing database.

I remapped the unique primary key part and used the property-ref attribute to reference the remapped property.

I am getting the following error.

29-Mar-2010 11:24: AM. ERROR BasicPropertyAccessor.get:191 - IllegalArgumentException in class: com.test.model.StudentId, getter method of property: stateId
Exception in thread "main" org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of com.test.model.StudentId.stateId
at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:195)
at org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValue(AbstractComponentTuplizer.java:87)
at org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValues(AbstractComponentTuplizer.java:93)
at org.hibernate.tuple.component.PojoComponentTuplizer.getPropertyValues(PojoComponentTuplizer.java:109)
at org.hibernate.type.ComponentType.getPropertyValues(ComponentType.java:376)
at org.hibernate.type.ComponentType.getHashCode(ComponentType.java:207)
at org.hibernate.engine.EntityKey.generateHashCode(EntityKey.java:126)
at org.hibernate.engine.EntityKey.<init>(EntityKey.java:70)
at org.hibernate.engine.StatefulPersistenceContext.getCollectionOwner(StatefulPersistenceContext.java:701)
at org.hibernate.loader.Loader.readCollectionElement(Loader.java:1016)
at org.hibernate.loader.Loader.readCollectionElements(Loader.java:669)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:614)
at org.hibernate.loader.Loader.doQuery(Loader.java:724)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
at org.hibernate.loader.Loader.loadCollection(Loader.java:2019)
at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:59)
at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:587)
at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:83)
at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1744)
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:366)
at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:10smilie
at org.hibernate.collection.PersistentSet.iterator(PersistentSet.java:186)
at com.test.Test.main(Test.java:26)
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:597)
at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:169)
... 22 more



Hibernate version : 3.3.1 GA

Reference Book :
Book : Java Persistance with Hibernate (i.e. Revised Edition of Hibernate In Action)
ISBN : 1-932394-88-5

Source xml for Mapping:

<hibernate-mapping>
<class name="com.test.model.Student" table="STUDENT" schema="APP" entity-name="student">

<composite-id name="id" class="com.test.model.StudentId">
<key-property name="stateId" type="string">
<column name="SSN" length="10" />
</key-property>
<key-property name="rollNumber" type="string">
<column name="RNUM" length="10" />
</key-property>
</composite-id>
<!-- Remapped part of primary key -->
<property name="roll" type="string" update="false" insert="false" unique="true">
<column name="RNUM" length="20"/>
</property>
<property name="fName" type="string">
<column name="FNM" length="20" />
</property>
<property name="lName" type="string">
<column name="LNM" length="20" />
</property>
<set name="progressCards">
<key column="RNUM" property-ref="roll"/>
<one-to-many entity-name="progresscard" />
</set>
</class>
<class name="com.test.model.ProgressCard" table="PROGRESSCARD" schema="APP" entity-name="progresscard">

<id name="examCode" type="string">
<column name="TESTNM" length="10" />
<generator class="assigned" />
</id>
<property name="rollNumber" type="string">
<column name="RNUM" length="10" />
</property>
<property name="score1" type="java.lang.Integer">
<column name="MARX1" />
</property>
<property name="score2" type="java.lang.Integer">
<column name="MARX2" />
</property>
</class>
</hibernate-mapping>

Thanks & Regards,
Srinivas Arava.