-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 
Author Message
 Post subject: composite key in child + save failures
PostPosted: Thu Aug 11, 2005 5:47 pm 
Newbie

Joined: Thu Aug 11, 2005 1:20 pm
Posts: 8
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:


Top
 Profile  
 
 Post subject:
PostPosted: Fri Aug 12, 2005 12:02 am 
Senior
Senior

Joined: Wed Jul 13, 2005 4:31 pm
Posts: 142
Location: Seattle, WA
I see two problems...

a. The mapping for parent table is to a ParentList class, but the class has the name Parent. That may just be a typo while you were writing the post. Let's assume it's all ParentList.

b. More importantly, the reference from ChildMember to ParentList should be private ParentList association;
instead of
private long association


Top
 Profile  
 
 Post subject: composite key in child + save failures
PostPosted: Fri Aug 12, 2005 1:13 pm 
Newbie

Joined: Thu Aug 11, 2005 1:20 pm
Posts: 8
thanks a lot,

You were right. There should be a private ParentList association in the ChildMember class, actually the ChildId class, along with the getter and setter for it.

sowmya.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.