Hi Jakob,
Figured out the problem. I'm using OJB in a way that it's not designer to
handle. The call to get the get the top level class in the Identity class
tracks back to the DescriptorRepository, where, the subclass must be declared in
an <extent> element. I'll resend to the list under a different subject to see
if there's a way I can add dynamic top class resolution to OJB.
Thank you so much for all your help with this problem. I hope I didn't take up
too much of your valuable time.
Cheers
Adam
Quoting [EMAIL PROTECTED]:
> Hi Jakob,
>
> I have some more information for you. The primary keys are all
> java.lang.Integer. The problem is occuring because my persistence
> descriptor
> uses an Interface rather than an actual class, and on the load operation
> uses
> the row reader creates the UserVO. I'm doing this because Users are passed
> around my system as interfaces, so I'd rather have the persistence acting on
> the
> interface rather than the value object. If there's not an easy way around
> this,
> I'll just switch it back to the value object in the persistence layer.
> However
> the Identity object seems to handle inheritences in it's constructure (where
> it
> takes the real class and the mapped class). Anything you could suggest would
> be
> greatly appreciated. My first preference is to keep the mapping at the
> interface level as it's cleaner for my design, and this would also allow
> other
> heirarchies to be accomodated (simple inheritance).
>
> By putting some system outs in the code I get the following, what you can
> see
> from this is that all other vars (pks) are equal, but the Identity objects
> differ in that one reverences com.interlinkj.ac.UserVO (the value object
> implementation) and the other references com.interlinkj.ac.User (the
> interface).
>
> :code:
>
> 376 // initialize the owner list map
> 377 for (Iterator it = owners.iterator(); it.hasNext();)
> 378 {
> 379 Object owner = it.next();
> 380 Identity ident = new Identity(owner, pb);
> 381 System.out.println("original owner pks");
> 382 Object[] pks = ident.getPrimaryKeyValues();
> 383 for(int i = 0; i < pks.length; i++){
> 384 System.out.println("key: " + pks[i]);
> 385 System.out.println("key: " +
> pks[i].getClass().getName());
> 386 }
> 387 ownerIdsToLists.put(new Identity(owner, pb), new
> ArrayList());
> 388 }
> 389
> 390 // build the children map
> 391 for (Iterator it = children.iterator(); it.hasNext();)
> 392 {
> 393 Object child = it.next();
> 394 childMap.put(new Identity(child, pb), child);
> 395 }
> 396
> 397 int ownerPkLen =
> getOwnerClassDescriptor().getPkFields().length;
> 398 int childPkLen =
> getItemClassDescriptor().getPkFields().length;
> 399 Object[] ownerPk = new Object[ownerPkLen];
> 400 Object[] childPk = new Object[childPkLen];
> 401
> 402 // build list of children based on m:n implementors
> 403 for (Iterator it = mToNImplementors.iterator();
> it.hasNext();)
> 404 {
> 405 Object[] mToN = (Object[]) it.next();
> 406
> 407 System.out.println("mToN");
> 408 for(int i = 0; i < mToN.length; i++){
> 409 System.out.println(mToN[i]);
> 410 System.out.println(mToN[i].getClass().getName());
> 411 }
> 412 System.out.println("mToN done");
> 413
> 414 System.arraycopy(mToN, 0, ownerPk, 0, ownerPkLen);
> 415 System.arraycopy(mToN, ownerPkLen, childPk, 0,
> childPkLen);
> 416
> 417 System.out.println("ownerPk");
> 418 for(int i = 0; i < ownerPk.length; i++){
> 419 System.out.println(ownerPk[i]);
> 420 System.out.println(ownerPk[i].getClass().getName());
> 421 }
> 422 System.out.println("ownerPk done");
> 423 System.out.println("childPk");
> 424 for(int i = 0; i < childPk.length; i++){
> 425 System.out.println(childPk[i]);
> 426 System.out.println(childPk[i].getClass());
> 427 }
> 428 System.out.println("childPk done");
> 429
> 430 System.out.println("ownerTopLevelClass: " +
> ownerTopLevelClass.getName());
> 431 System.out.println("childTopLevelClass: " +
> childTopLevelClass.getName());
> 432
> 433 Identity ownerId = new Identity(null,
> ownerTopLevelClass,
> ownerPk);
> 434 Identity childId = new Identity(null,
> childTopLevelClass,
> childPk);
> 435
> 436 for(final Iterator iter =
> ownerIdsToLists.keySet().iterator(); iter.hasNext(); ){
> 437 Identity key = (Identity) iter.next();
> 438 System.out.println("OwnerId: " + ownerId);
> 439 System.out.println("key: " + key);
> 440 System.out.println("OwnerId hashcode: " +
> ownerId.hashCode());
> 441 System.out.println("key hashcode: " +
> key.hashCode());
> 442 System.out.println("equal? " + ownerId.equals(key));
> 443 }
> 444
> 445 // Identities may not be equal due to type-mismatch
> 446 Collection list = (Collection)
> ownerIdsToLists.get(ownerId);
> 447 Object child = childMap.get(childId);
> 448 list.add(child);
> 449 }
>
>
>
> :output:
>
> original owner pks
> key: 1
> key: java.lang.Integer
> mToN
> 1
> java.lang.Integer
> 1
> java.lang.Integer
> mToN done
> ownerPk
> 1
> java.lang.Integer
> ownerPk done
> childPk
> 1
> class java.lang.Integer
> childPk done
> ownerTopLevelClass: com.interlinkj.ac.User
> childTopLevelClass: com.interlinkj.ac.Group
> OwnerId: com.interlinkj.ac.User{1}
> key: com.interlinkj.ac.UserVO{1}
> OwnerId hashcode: 597397265
> key hashcode: 1028287980
> equal? false
>
>
> Cheers
> Adam
>
>
> Quoting Jakob Braeuchi <[EMAIL PROTECTED]>:
>
> > hi adam,
> >
> > make sure the instvars representing the pk are of the same type (ie.
> > Integer).
> > the comment on line 405 points to this direction.
> >
> > jakob
> >
> > [EMAIL PROTECTED] schrieb:
> > > Hi Jakob,
> > >
> > > Thanks for the quick response. I'm using the 1.0.1 release.
> > >
> > > The npe occuring at line 408 (snippet below). In the scenario I'm
> running
> > both
> > > 'list' and 'child' are null. The npe is from the 'list.add' call.
> > >
> > > 405 // Identities may not be equal due to type-mismatch
> > > 406 Collection list = (Collection)
> > ownerIdsToLists.get(ownerId);
> > > 407 Object child = childMap.get(childId);
> > > 408 list.add(child);
> > >
> > > Cheers
> > > Adam
> > >
> > > Quoting Jakob Braeuchi <[EMAIL PROTECTED]>:
> > >
> > >
> > >>hi,
> > >>
> > >>what version of ojb are you using ? could you please provide the line
> > number
> > >>
> > >>where the npe occurs ?
> > >>
> > >>jakob
> > >>
> > >>[EMAIL PROTECTED] schrieb:
> > >>
> > >>
> > >>>
> > >>>Hi All,
> > >>>
> > >>>I'm firing this at both lists as I can't figure out whether it's a bug
> in
> > >>
> > >>the
> > >>
> > >>>code or my mapping.
> > >>>
> > >>>I'm trying to accomplish a pretty simple mn relationship (user/group
> type
> > >>>arrangement). The mapping file for the section in question is
> attached
> > >>
> > >>below.
> > >>
> > >>> I have some test data (also below, in dbunit dataset format) which
> I've
> > >>>verified in the database and everytime I try to load a group it throws
> a
> > >>
> > >>null
> > >>
> > >>>pointer at me. Any assistance would be appreciated. Let me know if
> you
> > >>
> > >>would
> > >>
> > >>>like any more information.
> > >>>
> > >>>
> > >>>:Mapping File:
> > >>>
> > >>> <class-descriptor
> > >>> class="com.interlinkj.ac.User"
> > >>> table="USERS"
> > >>> row-reader="com.interlinkj.db.UserRowReader">
> > >>> <field-descriptor
> > >>> name="id"
> > >>> column="id"
> > >>> jdbc-type="INTEGER"
> > >>> primarykey="true"
> > >>> autoincrement="true"/>
> > >>> <field-descriptor
> > >>> name="firstName"
> > >>> column="firstname"
> > >>> jdbc-type="VARCHAR"
> > >>> nullable="false"/>
> > >>> <field-descriptor
> > >>> name="lastName"
> > >>> column="lastname"
> > >>> jdbc-type="VARCHAR"
> > >>> nullable="false"/>
> > >>> <field-descriptor
> > >>> name="userName"
> > >>> column="username"
> > >>> jdbc-type="VARCHAR"
> > >>> nullable="false"/>
> > >>> <field-descriptor
> > >>> name="passwordHash"
> > >>> column="credentials"
> > >>> jdbc-type="VARCHAR"
> > >>> nullable="false"/>
> > >>> <collection-descriptor
> > >>> name="groups"
> > >>> element-class-ref="com.interlinkj.ac.Group"
> > >>> indirection-table="USER_GROUP_LINK"
> > >>> auto-delete="link"
> > >>> auto-update="object"
> > >>> auto-retrieve="true"
> > >>> orderby="id"
> > >>> sort="ASC"
> > >>> >
> > >>> <fk-pointing-to-this-class column="user_id"/>
> > >>> <fk-pointing-to-element-class column="group_id"/>
> > >>> </collection-descriptor>
> > >>> </class-descriptor>
> > >>>
> > >>> <class-descriptor
> > >>> class="com.interlinkj.ac.Group"
> > >>> table="GROUPS"
> > >>> row-reader="com.interlinkj.db.GroupRowReader">
> > >>> <field-descriptor
> > >>> name="id"
> > >>> column="id"
> > >>> jdbc-type="INTEGER"
> > >>> primarykey="true"
> > >>> autoincrement="true"/>
> > >>> <field-descriptor
> > >>> name="name"
> > >>> column="name"
> > >>> jdbc-type="VARCHAR"
> > >>> nullable="false"/>
> > >>> <field-descriptor
> > >>> name="description"
> > >>> column="description"
> > >>> jdbc-type="VARCHAR"
> > >>> nullable="true"/>
> > >>> <field-descriptor
> > >>> name="type"
> > >>> column="type"
> > >>> jdbc-type="VARCHAR"
> > >>> nullable="false"
> > >>> conversion="com.interlinkj.db.GroupTypeConversion"/>
> > >>> <collection-descriptor
> > >>> name="users"
> > >>> element-class-ref="com.interlinkj.ac.User"
> > >>> indirection-table="USER_GROUP_LINK"
> > >>> auto-delete="link"
> > >>> auto-update="object"
> > >>> auto-retrieve="true"
> > >>> orderby="id"
> > >>> sort="ASC"
> > >>> >
> > >>> <fk-pointing-to-this-class column="group_id"/>
> > >>> <fk-pointing-to-element-class column="user_id"/>
> > >>> </collection-descriptor>
> > >>> </class-descriptor>
> > >>>
> > >>>:Test Data (for those not familiar with DBUnit, the element name is the
> > >>
> > >>table,
> > >>
> > >>>the attributes are the columns, and each element represents a row [in
> > >>
> > >>order]):
> > >>
> > >>><dataset>
> > >>> <GROUPS id="1" type="Designer Group" name="Designer Group"
> > >>>description="This is a designer group."/>
> > >>> <GROUPS id="2" type="Data Entry Group" name="Data Entry Group"
> > >>>description="This is a data entry group."/>
> > >>> <USERS id="1" firstname="Bernard" lastname="Black"
> > >>
> > >>username="blblack"
> > >>
> > >>>credentials="jamjamjam"/>
> > >>> <USERS id="2" firstname="Manny" lastname="Bianco"
> username="manny"
> > >>>credentials="brilliant"/>
> > >>> <USER_GROUP_LINK group_id="1" user_id="1"/>
> > >>> <USER_GROUP_LINK group_id="2" user_id="2"/>
> > >>></dataset>
> > >>>
> > >>>
> > >>>:Stack Trace:
> > >>>
> > >>>java.lang.NullPointerException
> > >>> at
> > >>>
> > >>
> > >
> >
>
org.apache.ojb.broker.accesslayer.MtoNCollectionPrefetcher.associateBatched(Unknown
> > >
> > >>>Source)
> > >>> at
> > >>>
> > >>
> > >
> >
>
org.apache.ojb.broker.accesslayer.MtoNCollectionPrefetcher.prefetchRelationship(Unknown
> > >
> > >>>Source)
> > >>> at
> > >>>
> > >>
> >
> >>org.apache.ojb.broker.core.QueryReferenceBroker.performRetrievalTasks(Unknown
> > >>
> > >>>Source)
> > >>> at
> > >>>
> > >>
> >
> >>org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(Unknown
> > >>Source)
> > >>
> > >>> at
> > >>>
> > >>
> >
> >>org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(Unknown
> > >>Source)
> > >>
> > >>> at
> > >>>
> > >>
> >
> >>org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(Unknown
> > >>Source)
> > >>
> > >>> at
> >
> >>>org.apache.ojb.broker.core.QueryReferenceBroker.retrieveCollection(Unknown
> > >>
> > >>Source)
> > >>
> > >>> at
> >
> >>>org.apache.ojb.broker.core.QueryReferenceBroker.retrieveCollections(Unknown
> > >>
> > >>Source)
> > >>
> > >>> at
> >
> >>>org.apache.ojb.broker.accesslayer.RsIterator.getObjectFromResultSet(Unknown
> > >>
> > >>Source)
> > >>
> > >>> at org.apache.ojb.broker.accesslayer.RsIterator.next(Unknown
> > >>
> > >>Source)
> > >>
> > >>> at
> >
> >>>org.apache.ojb.broker.core.PersistenceBrokerImpl.getObjectByQuery(Unknown
> > >>
> > >>Source)
> > >>
> > >>> at
> > >>>
> > >>
> >
> >>org.apache.ojb.broker.core.DelegatingPersistenceBroker.getObjectByQuery(Unknown
> > >>
> > >>>Source)
> > >>> at
> > >>>
> > >>
> >
> >>org.apache.ojb.broker.core.DelegatingPersistenceBroker.getObjectByQuery(Unknown
> > >>
> > >>>Source)
> > >>> at com.interlinkj.db.DatabaseManager.loadByFieldValue(Unknown
> > >>
> > >>Source)
> > >>
> > >>> at com.interlinkj.db.GroupManager.loadById(Unknown Source)
> > >>> at
> > >>
> > >>com.interlinkj.db.TestGroupManager.testLoadWithIndividualUser(Unknown
> > >>
> > >>>Source)
> > >>> 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:585)
> > >>> at junit.framework.TestCase.runTest(TestCase.java:154)
> > >>> at junit.framework.TestCase.runBare(TestCase.java:127)
> > >>>
> > >>>
> > >>>:Calling Code:
> > >>>
> > >>> Criteria crit = new Criteria();
> > >>> crit.addEqualTo("id", new Integer(1));
> > >>> Query q = newQuery(Group.class, crit);
> > >>> broker = newPersistenceBroker(); //just a helper method to
> > >>
> > >>default
> > >>
> > >>>broker
> > >>> Object tmp = broker.getObjectByQuery(q);
> > >>>
> > >>> //Null pointer before it gets here
> > >>>
> > >>> if(tmp == null){
> > >>> throw new FindException(
> > >>> getShortClassName(clazzToLoad) +
> > >>> " with " +
> > >>> fieldName +
> > >>> " of " +
> > >>> fieldValue +
> > >>> " does not exist."
> > >>> );
> > >>> }
> > >>> return (T)tmp;
> > >>>
> > >>>
> > >>>
> > >>>
> > >>>------------------------------------------------------------
> > >>>This email was sent from Netspace Webmail: http://www.netspace.net.au
> > >>>
> > >>>
> > >>>---------------------------------------------------------------------
> > >>>To unsubscribe, e-mail: [EMAIL PROTECTED]
> > >>>For additional commands, e-mail: [EMAIL PROTECTED]
> > >>>
> > >>>
> > >>
> > >>---------------------------------------------------------------------
> > >>To unsubscribe, e-mail: [EMAIL PROTECTED]
> > >>For additional commands, e-mail: [EMAIL PROTECTED]
> > >>
> > >>
> > >
> > >
> > >
> > >
> > >
> > >
> > > ------------------------------------------------------------
> > > This email was sent from Netspace Webmail: http://www.netspace.net.au
> > >
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > For additional commands, e-mail: [EMAIL PROTECTED]
> > >
> > >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> >
> >
>
>
>
>
>
> ------------------------------------------------------------
> This email was sent from Netspace Webmail: http://www.netspace.net.au
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>
------------------------------------------------------------
This email was sent from Netspace Webmail: http://www.netspace.net.au
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]