Hi Armin, all, I have tried your solutions, but I ran into a problem, because I was working with rc4. ojb rc4 doesn't have the .link() method in the ServiceBrokerHelper yet. So I downloaded rc6, ran the ojb-blank target, inserted my files and created a rc6-version of my project. I got it all to build, but at the first ojb-related query, I get this in my logging window:
15:52:11,531 INFO [BaseSubmitter] handleSubmit: Getting persistence broker... 15:52:12,031 INFO [STDOUT] [BOOT] WARN: 15:52:12,031 INFO [STDOUT] Value "org.apache.ojb.odmg.collections.DListImpl_2" is illegal for key "OqlCollectionClass" (should be a class, using default value org.apache.ojb.odmg.collections.DListImpl) 15:52:12,359 INFO [STDOUT] [DEFAULT] ERROR: 15:52:12,359 INFO [STDOUT] ** org.apache.ojb.broker.metadata.RepositoryTags: Tag 'object-cache' is not defined. ** Does this mean anything to you? Thanks, -Stijn ----- Original Message ----- From: "Armin Waibel" <[EMAIL PROTECTED]> To: "OJB Users List" <[EMAIL PROTECTED]> Sent: Friday, April 09, 2004 2:00 PM Subject: Re: Problems saving a m:n relationship > Hi Stijn, > > a few days ago I wrote some tests for M:N handling in odmg-api and > stumble across the same problem (hope we can fix this soon). There are > two possible workarounds: > > Transaction tx = odmg.newTransaction(); > tx.begin(); > Iterator it = person.getAddresses().iterator(); > while(it.hasNext()) > { > database.makePersistent(it.next()); > } > database.makePersistent(person); > tx.commit(); > > or you can use the pb-api to insert your object (this looks a little bit > complex, because you have to set auto-update/delete false when using > odmg-api): > > TransactionExt tx = (TransactionExt) odmg.newTransaction(); > tx.begin(); > PersistenceBroker pb = tx.getBroker(); > Iterator it = person.getAddresses().iterator(); > while(it.hasNext()) > { > pb.store(it.next()); > } > pb.store(person); > pb.serviceBrokerHelper().link(person, true); > tx.commit(); > > Hope this will help you. > > regards, > Armin > > Stijn de Witt wrote: > > > Hi, > > > > I have a problem trying to persist two objects that are related through an indirection table. This is what my tables look like: > > > > ----- > > PERSON > > id > > firstname > > lastname > > ... > > > > ADDRESS > > id > > street > > housenr > > ... > > > > PERSON_ADDRESS > > person_id > > address_id > > ----- > > > > > > I have chosen for this construction, because COMPANY can have multiple addresses too, so I don't want a column person_id in ADDRESS. One address doesn't have to be available for multiple PERSON's or COMPANY's or whatever, so it actually is more of a 1:n relationship using an indirection table. So PERSON_ADDRESS will often contain the same person_id multiple times, but not the same address_id. > > I've read the tutorials, but I don't get it to work. I'll show (a fragment of) our repository_user.xml: > > > > > > ----- > > <class-descriptor > > class="nl.bergland.codamo.Address" > > table="bit_Address" > > > > <field-descriptor > > name="id" > > column="id" > > jdbc-type="INTEGER" > > primarykey="true" > > length="11" > > > > > </field-descriptor> > > <field-descriptor > > name="street" > > column="street" > > jdbc-type="VARCHAR" > > length="64" > > > > > </field-descriptor> > > <field-descriptor > > name="houseNr" > > column="houseNr" > > jdbc-type="VARCHAR" > > length="16" > > > > > </field-descriptor> > > </class-descriptor> > > > > <class-descriptor > > class="nl.bergland.codamo.Person" > > table="bit_Person" > > > > <field-descriptor > > name="id" > > column="id" > > jdbc-type="INTEGER" > > primarykey="true" > > length="11" > > > > > </field-descriptor> > > <field-descriptor > > name="firstName" > > column="firstName" > > jdbc-type="VARCHAR" > > length="24" > > > > > </field-descriptor> > > <field-descriptor > > name="lastName" > > column="lastName" > > jdbc-type="VARCHAR" > > length="24" > > > > > </field-descriptor> > > <collection-descriptor > > name="addresses" > > element-class-ref="nl.bergland.codamo.Address" > > indirection-table="bit_PersonAddress" > > auto-retrieve="true" > > auto-update="true" > > auto-delete="true" > > > > > <fk-pointing-to-this-class column="personId"/> > > <fk-pointing-to-element-class column="addressId"/> > > </collection-descriptor> > > </class-descriptor> > > ----- > > > > > > The generated tables in mysql seem to be ok with me (we actually use OjbDoclet to generate the repository.xml and the SQL) and insertion of a PERSON works fine. However, when we create a new person, add a new Address to it and try to save the person, the following happens: > > > > A new record gets created for PERSON fine > > A new record gets created for ADDRESS fine, but when I set auto-update to true, 2 get created?? > > A new record gets created for PERSON_ADDRESS, but both the columns person_id and address_id are set to 0. > > > > Our save code looks something like this: > > > > > > ----- > > Person person = new Person; > > person.getAddresses().add(new Address()); > > > > Implementation impl = OJB.getInstance(); > > Database db = impl.newDatabase(); > > > > db.open("default", Database.OPEN_READ_WRITE); > > Transaction tx = impl.newTransaction(); > > tx.begin(); > > > > // establish database locks on all root dataobjects > > tx.lock(person, Transaction.WRITE); > > > > > > // set person and address values > > // ... > > > > tx.commit(); > > db.close(); > > ----- > > > > > > A lot of info for a first-time post, I hope this problem sounds familiar to someone here. > > Thanks, > > > > -Stijn > > > > > > --------------------------------------------------------------------- > 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]