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?
this sounds like a classloader problem. Do really replace all ojb-jar files (and config files) in your app classpath?
regards, Armin
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]
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]