Ralf,
thanks, the bi-directional mapping did the trick. also, it is working, and i
am not calling this line:
thing.setStuffs(new ArrayList());
thing.getStuffs().add(stuff);
i'm gonna add that line to be safe, but it looks like it is not necessary in
some situations.
thanks for your tip, i had noticed that issue with uppercase identifier
names, but didn't realize it was castor specific. we are fine with all lower
case.
2009/9/2 Ralf Joachim <[email protected]>
> Hi Peter,
>
> it looks like you are using a unidirectional relation between Stuff and
> Thing. Castor docs say this is not supported. While I use unidirectional
> mappings in some cases I never did so for many to many relations. Therefore
> I am not sure if this really is the reason for your problem but chances are
> quite high.
>
> I suggest you to use a bidirectional mapping for many to many relations
> (Stuff references Thing and Thing references Stuff). In addition you have to
> care that both sides of the relation are in sync before you call one of
> Castor's methods to persist your objects.
>
> public static void testStuffAndThings() {
> Database database = jdoManager.getDatabase();
> database.begin();
>
> Thing thing = new Thing(1,"My Thing");
> database.create(thing);
>
> Stuff stuff = new Stuff(1,"My Stuff");
> database.create(stuff);
>
> stuff.setThings(new ArrayList());
> stuff.getThings().add(thing);
>
> thing.setStuffs(new ArrayList());
> thing.getStuffs().add(stuff);
>
> database.commit();
>
> database.begin();
>
> stuff = (Stuff) database.load(Stuff.class, 1);
> thing = stuff.getThings().remove(0);
> thing.getStuffs().remove(0);
>
> database.remove(thing);
>
> database.commit();
> database.close();
> }
>
> P.S. At the moment I working at a project that also uses PostgreSQL
> together with Castor. During this project I recognized some issues in Castor
> related to the handling of identifier names (table and column names) of
> PostgreSQL. If you want to use upper case identifier names you will need to
> use SVN head where I already fixed all these issues. Lower case identifier
> names will work with 1.3.
>
> Regards
> Ralf
>
>
> peter cowan schrieb:
>
> werner,
> there are two foreign keys in the stuff_and_things table:
>
> "stuff_and_things_stuff_id_fkey" FOREIGN KEY (stuff_id) REFERENCES
> stuff(id)
> "stuff_and_things_thing_id_fkey" FOREIGN KEY (thing_id) REFERENCES
> things(id)
>
> also, for total completeness, we are using castor 1.3, our database is
> postgresql 8.1 and
> we are using postgresql-8.1-407.jdbc3.jar
>
> what is the expected behavior in the scenarios i laid out?
>
> -peter
>
> On Wed, Sep 2, 2009 at 1:06 AM, Werner Guttmann <[email protected]>wrote:
>
>> Peter,
>>
>> can you please highlight the (e.g. foreign key) constraints in your SQL
>> schema, just for completeness ?
>>
>> Regards
>> Werner
>>
>> peter cowan wrote:
>> > I have a pretty standard many-to-many relation mostly working, I can
>> create
>> > , load and update objects fine, and the database tables populate as
>> > expected, however when I try to remove objects I am running into
>> trouble.
>> > Below is a database description, the mapping and some example code.
>> >
>> > database tables:
>> >
>> > table - stuff:
>> > id - int
>> > name - varchar
>> >
>> > table - things:
>> > id - int
>> > name - varchar
>> >
>> > table - stuff_and_things:
>> > id - int
>> > stuff_id - int
>> > thing_id - int
>> >
>> > <mapping>
>> > <class name="my.test.app.Stuff" identity="id">
>> > <map-to table="stuff"/>
>> > <field name="id" type="int">
>> > <sql name="id" type="integer" />
>> > </field>
>> > <field name="name" type="string">
>> > <sql name="name" type="varchar" />
>> > </field>
>> > <field name="things" type="my.test.app.Thing"
>> > collection="arraylist">
>> > <sql name="stuff_id"
>> > many-table="stuff_and_things"
>> > many-key="thing_id" />
>> > </field>
>> > </class>
>> >
>> > <class name="my.test.app.Thing" identity="id">
>> > <map-to table="things" />
>> > <field name="id" type="int">
>> > <sql name="id" type="integer" />
>> > </field>
>> > <field name="name" type="string">
>> > <sql name="name" type="varchar" />
>> > </field>
>> > </class>
>> > </mapping>
>> >
>> > Both Stuff and Thing are simple Java Beans and nothing more.
>> >
>> > In the below example, the objects are created correctly in the first
>> > transaction, and loaded correctly in the second transaction. When I try
>> to
>> > remove a Thing from the ArrayList data member of Stuff, the Thing is
>> only
>> > removed from the relation table stuff_and_things, and an orphan is left
>> in
>> > the things table. This makes enough sense, however, when I try to then
>> > remove the Thing from the database by uncommenting
>> > 'database.remove(thing);', I get an exception that it can't be removed
>> due
>> > to foreign key constraints in stuff_and_things. This also makes sense,
>> but I
>> > am left wondering, what am I doing wrong? How do I go about deleting
>> those
>> > orphaned records without doing it in a second transaction?
>> >
>> > public static void testStuffAndThings() {
>> > Database database = jdoManager.getDatabase();
>> > database.begin();
>> >
>> > Thing thing = new Thing(1,"My Thing");
>> > Stuff stuff = new Stuff(1,"My Stuff");
>> > ArrayList things = new ArrayList();
>> > things.add(thing);
>> > stuff.setThings(things);
>> >
>> > database.create(thing);
>> > database.create(stuff);
>> > database.commit();
>> >
>> > database.begin();
>> > stuff = (Stuff) database.load(Stuff.class, 1);
>> > things = stuff.getThings();
>> > thing = things.remove(0);
>> > //database.remove(thing);
>> > database.commit();
>> > database.close();
>> > }
>> >
>> > thanks,
>> > -peter
>> >
>>
>> ---------------------------------------------------------------------
>> To unsubscribe from this list, please visit:
>>
>> http://xircles.codehaus.org/manage_email
>>
>>
>>
>
> --
>
> Syscon Ingenieurbüro für Meß- und Datentechnik GmbH
> Ralf Joachim
> Raiffeisenstraße 11
> 72127 Kusterdingen
> Germany
>
> Tel. +49 7071 3690 52
> Mobil: +49 173 9630135
> Fax +49 7071 3690 98
>
> Internet: www.syscon.eu
> E-Mail: [email protected]
>
> Sitz der Gesellschaft: D-72127 Kusterdingen
> Registereintrag: Amtsgericht Stuttgart, HRB 382295
> Geschäftsleitung: Jens Joachim, Ralf Joachim
>
> --------------------------------------------------------------------- To
> unsubscribe from this list, please visit:
> http://xircles.codehaus.org/manage_email