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. >