hi,
i am doing my first hibernate project and I have to have a composite primary key in my child table. I know it is recommended that we use surrogate keys for the id, but there is no way that I can modify the design of the key.
This fails at save, update etc. I tried several things over the past couple of days, like not having the many-to-one, having the key-many-to-one, etc, but nothing seems to work. Is there something that I am missing here, as far as the mapping or anything goes ? Would be great if someone could help me figure this out.
Thanks a lot,
sowmya.
Hibernate version: 3
Mapping documents:
My mapping is as follows.
PARENT -
<class name="ParentList" table="parenttable">
<id name="m_DbId" column="parentid" type="long">
<generator class="sequence">
<param name="sequence">SEQ_PARENTID</param>
</generator>
</id>
<map name="ChildSet" table="childtable" lazy="false" inverse="true" cascade="all" >
<key column="parentid" />
<map-key column="profileid" type="customtype.UserType"/>
<one-to-many class="ChildMember" />
</map>
</class>
class Parent
{
private long m_DbId;
private Map ChildSet; <long, ChildMember>
//Getter and setter for the same
}
CHILD -
<class name="ChildMember" table="childtable">
<composite-id name="ChildId" class="ChildId" >
<key-property name="ParentId" column="parentid" type="long"/>
<key-property name="UserId" column="Profileid" type="customtype.UserType"/>
</composite-id>
// Using a many-to-one here since HIA recommended it
// Also tried a <key-many-to-one name="ParentId">, but that did not work either
<many-to-one name="Association" class="ParentList" column="parentid" insert="false" update="false"/>
</class>
class ChildMember
{
private ChildId childId;
// Used a child id class because the book Hibernate in Action recommended it
//Tried with and without private long Association;
getter and setter for both
}
class ChildId
{
private long parentId;
private long userId;
getter and setter for both
}
Code between sessionFactory.openSession() and session.close():
ParentList pl = new ParentList();
pl.initialize(); // This just sets test values for the field
session.save(pl);
Full stack trace of any exception that occurs:
(BasicPropertyAccessor.java:115) - IllegalArgumentException in class: ParentList, getter method of property: m_DbId
08/11/05 14:24:59:875: [main]: HibernateExceptionAdapter: caught exception: org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of ParentList.m_DbId
08/11/05 14:24:59:875: [main]: org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of ParentList.m_DbId
at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:119)
at org.hibernate.tuple.AbstractTuplizer.getIdentifier(AbstractTuplizer.java:103)
at org.hibernate.persister.entity.BasicEntityPersister.getIdentifier(BasicEntityPersister.java:2944)
at org.hibernate.persister.entity.BasicEntityPersister.isTransient(BasicEntityPersister.java:2705)
at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:181)
at org.hibernate.engine.ForeignKeys$Nullifier.isNullifiable(ForeignKeys.java:137)
at org.hibernate.engine.ForeignKeys$Nullifier.nullifyTransientReferences(ForeignKeys.java:69)
at org.hibernate.engine.ForeignKeys$Nullifier.nullifyTransientReferences(ForeignKeys.java:47)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:234)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:160)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:108)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:184)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:173)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:96)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:69)
at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:468)
at org.hibernate.engine.Cascades$5.cascade(Cascades.java:154)
at org.hibernate.engine.Cascades.cascadeAssociation(Cascades.java:771)
at org.hibernate.engine.Cascades.cascade(Cascades.java:720)
at org.hibernate.engine.Cascades.cascadeCollection(Cascades.java:895)
at org.hibernate.engine.Cascades.cascadeAssociation(Cascades.java:792)
at org.hibernate.engine.Cascades.cascade(Cascades.java:720)
at org.hibernate.engine.Cascades.cascade(Cascades.java:847)
at org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:363)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:265)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:160)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:108)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:184)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:173)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:69)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:481)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:476)
at com.pogo.db.DbSession.save(DbSession.java:59)
at ListAccessor.saveParentList(ListAccessor.java:67)
at TestList.saveList(TestList.java)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at junit.framework.TestCase.runTest(TestCase.java:154)
at org.jmock.core.VerifyingTestCase.runBare(Unknown Source)
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 junit.framework.TestSuite.run(TestSuite.java:203)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:436)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:311)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
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(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:105)
... 52 more
Name and version of the database you are using:
Oracle 9i
The generated SQL (show_sql=true):
Hibernate: select SEQ_PARENTID.nextval from dual
Hibernate: select childtab_.parentid, childtab_.Profileid from childmember childtab_ where childtab_.parentid=? and childtab_.Profileid=?
-gives the exception next -
Debug level Hibernate log excerpt:
|