Re: n:m mapping problem

Armin Waibel <[email protected]> Fri, 07 Sep 2007 03:42:29 +0200
Newsgroups gmane.comp.jakarta.ojb.user
Message-ID <[email protected]>
Hi,

your mapping seems ok. Sounds like a bug in OJB.
I tried to reproduce your problem without success (using latest version 
of OJB from SVN OJB_1_0_RELEASE branch) - never get a NPE.
I use the mapping from the m:n example (with Person and Project) and do:

oid = broker.serviceIdentity().buildIdentity(Person.class, new Integer(1));
person = (Person) broker.getObjectByIdentity(oid);

No NPE. How can I reproduce your problem?

regards,
Armin


Truong Nguyen Huy wrote:
> Hi all,
> 
> I have a problem when using m:n mapping. I will describe it below.
> 
> I just implement a tutorial in this link 
> http://db.apache.org/ojb/docu/guides/basic-technique.html#Support+for+Non-Decomposed+m%3An+Mappings
> 
> 
> There are three table: PERSON, PROJECT, PROJECT_PERSON.
> PROJECT_PERSON is the connector standing for m:n relation between
> PROJECT and PERSON.
> 
> PROJECT(id,name) PERSON(id,name) PROJECT_PERSON(project_id,
> person_id)
> 
> The mapping file as below:____________________________
> 
> <!--           vn.com.tma.testOJB.Person              --> 
> <class-descriptor class="vn.com.tma.testOJB.Person"
> 
> 
> table="person" <field-descriptor name="id" column="id" 
> jdbc-type="INTEGER" primarykey="true" autoincrement="true" /> 
> <field-descriptor name="name" column="name" jdbc-type="VARCHAR" />
> 
> 
> <collection-descriptor name="projects" collection-class=" 
> org.apache.ojb.broker.util.collections.ManageableArrayList" 
> element-class-ref="vn.com.tma.testOJB.Project" auto-retrieve="true" 
> auto-update="true" indirection-table="PROJECT_PERSON"
>> 
> <fk-pointing-to-this-class column="PERSON_ID"/> 
> <fk-pointing-to-element-class column="PROJECT_ID"/> 
> </collection-descriptor>
> 
> </class-descriptor>
> 
> <!--           vn.com.tma.testOJB.Project              --> 
> <class-descriptor class="vn.com.tma.testOJB.Project"
> 
> table="project" <field-descriptor name="id" column="id" 
> jdbc-type="INTEGER" primarykey="true" autoincrement="true" /> 
> <field-descriptor name="name" column="Name" jdbc-type="VARCHAR" /> 
> <collection-descriptor name="employees" collection-class=" 
> org.apache.ojb.broker.util.collections.ManageableArrayList" 
> element-class-ref="vn.com.tma.testOJB.Person" auto-retrieve="true" 
> auto-update="false" indirection-table="PROJECT_PERSON"
>> 
> <fk-pointing-to-this-class column="PROJECT_ID"/> 
> <fk-pointing-to-element-class column="PERSON_ID"/> 
> </collection-descriptor> </class-descriptor>
> 
> When I run these codes, it has error: PersistenceBroker broker = 
> PersistenceBrokerFactory.defaultPersistenceBroker(); Identity oid =
> broker.serviceIdentity().buildIdentity(Person.class, new Integer(1));
>  Person person = (Person) broker.getObjectByIdentity(oid);
> 
> The error is caused by the third line. This is the exception stack:
> 
> Exception in thread "main"
> org.apache.ojb.broker.PersistenceBrokerException: 
> java.lang.NullPointerException at
> org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(Unknown
>  Source) at
> org.apache.ojb.broker.core.QueryReferenceBroker.doRetrieveCollection(Unknown
>  Source) at
> org.apache.ojb.broker.core.QueryReferenceBroker.retrieveCollection(Unknown
>  Source) at
> org.apache.ojb.broker.core.QueryReferenceBroker.doRetrieveCollections(Unknown
>  Source) at
> org.apache.ojb.broker.core.QueryReferenceBroker.retrieveCollections(Unknown
>  Source) at
> org.apache.ojb.broker.core.PersistenceBrokerImpl.getDBObject(Unknown 
> Source) at 
> org.apache.ojb.broker.core.PersistenceBrokerImpl.doGetObjectByIdentity(Unknown
>  Source) at
> org.apache.ojb.broker.core.PersistenceBrokerImpl.getObjectByIdentity(Unknown
>  Source) at 
> org.apache.ojb.broker.core.DelegatingPersistenceBroker.getObjectByIdentity(Unknown
>  Source) at 
> org.apache.ojb.broker.core.DelegatingPersistenceBroker.getObjectByIdentity(Unknown
>  Source) at vn.com.tma.main.Run.main(Run.java:41) Caused by:
> 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) ... 11 more
> 
> But if I change auto-archive to "false" in arbitrary one of two 
> class-descriptor, there is no error anymore. But it still causes the
> same error when I use method "broker.retrieveAllReferences()" on an
> instance of the rest class-descriptor.
> 
> Only when I change auto-archive of both class-descriptor to "false",
> the error is omitted.
> 
> Can anyone explain why and help me resolve the problem when using 
> auto-archive="true" on both class-descriptor? Thank you very for your
> help.
>