Hi Armin,
Thanks for your helpful response!
So if i understand you correctly, OJB's ODMG implementation, at the moment
doesn't support fully transparent m:n relations, but it might in the future?
The workarounds you showed look ok to me, but I have another question. In
the tutorials, the PersistenceBroker API is used for the m:n relationships.
OJB also offers JDO support (through a plugin, native later). Could you
advise me on the API to use? We were planning on using ODMG because it's
'official', but we don't have enough know-how to make a really informed
decision.
If you were planning on building a lare portal based on Jetspeed using OJB,
what persistence api would you choose? Am I right in thinking that the
PersistenceBroker API is the most feature-rich? The official site somehow
conveys that to me...
Thanks for your answer and I'll try your workarounds immediately!
-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]