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]



Reply via email to