Thanks Armen, that worked. I've made this same mistake before, you would think I'd learn :)
...you are in good company, the history of mankind is an endless list of repeated mistakes ;-)
The AdmObject will have many more extents in the full application. Every persistent class will extend it, or a subclass of it. I only had one class extending it in this subset.
I ask this each time, because using inheritance can be a performance killer and should be avoided if possible. So if you don't regular need query for AdmObject's, don't declare the mapping.
Armin
-----Original Message-----
From: Armin Waibel [mailto:[EMAIL PROTECTED] Sent: Tuesday, March 22, 2005 8:38 AM
To: OJB Users List
Subject: Re: Updating instead of Inserting
Hi Wes,
why did you need mapping for AdmObject when only one class "extent" AdmObject?
In mapping for NCG
<collection-descriptor name="subgroups" element-class-ref="model.client.Subgroup" auto-delete="true" auto-update="true" > <inverse-foreignkey field-ref="objectId" /> </collection-descriptor>
the inverse-foreignkey refer to the PK field of SG. Think this is not correct, you need a FK field in SG to store the PK value of NCG. This FK
field must also be used by the 'clientGroup' reference in SG [don't use an anomymous field, because of the 1:n relation http://db.apache.org/ojb/docu/guides/advanced-technique.html#How+do+ ]
regards, Armin
Lemke, Wesley wrote:
I have 4 classes:
AdmObject -- highlevel class that all of our persistent classes extend. Contains objectId field. Generic Group -- Abstract. Extends AdmObject. Contains common fields for NewClientGroup and Subgroup and
the ojbConcreteClass. NewClientGroup -- extends Generic Group, contains a collection of Subgroups.
Subgroup -- extends Generic Group. Has a reference to the
NewClientGroup.
I am trying to persist NewClientGroup and Subgroup (along with common fields in Generic Group) to the same table. Here is a portion of my mapping document (most of the common fields from Generic group are removed to simplifiy):
<class-descriptor
class="model.AdmObject">
<extent-class class-ref="model.client.GenericGroup" /> </class-descriptor>
<class-descriptor
class="model.client.GenericGroup">
<extent-class class-ref="model.client.Subgroup" />
<extent-class class-ref="model.client.NewClientGroup" /> </class-descriptor>
<class-descriptor
class="model.client.NewClientGroup"
table="client_group">
<field-descriptor
name="objectId"
column="group_id"
jdbc-type="INTEGER"
primarykey="true"
autoincrement="true"
access="readonly"
/>
<field-descriptor
name="internalClientNumber"
column="INN_CLIENT_NB"
jdbc-type="VARCHAR"
/>
<field-descriptor
name="ojbConcreteClass"
column="CLASS_NAME"
jdbc-type="VARCHAR"
/>
<collection-descriptor
name="subgroups"
element-class-ref="model.client.Subgroup"
auto-delete="true"
auto-update="true"
>
<inverse-foreignkey field-ref="objectId" />
</collection-descriptor>
</class-descriptor>
<class-descriptor
class="model.client.Subgroup"
table="client_group"
>
<field-descriptor
name="objectId"
column="group_id"
jdbc-type="INTEGER"
primarykey="true"
autoincrement="true"
access="readonly"
/>
<field-descriptor
name="name"
column="NAME"
jdbc-type="VARCHAR"
/>
<field-descriptor
name="ojbConcreteClass"
column="CLASS_NAME"
jdbc-type="VARCHAR"
/>
<reference-descriptor name="clientGroup" class-ref="model.client.NewClientGroup">
<foreignkey field-ref="objectId"/>
</reference-descriptor>
</class-descriptor>
Here is the code I am using: broker.beginTransaction(); NewClientGroup ncg = new NewClientGroup(); ncg.setInternalClientNumber("IntClntNbr"); Subgroup sg = new Subgroup(); sg.setName("FirstSubgroup"); ncg.addSubgroup(sg); Subgroup sg2 = new Subgroup(); sg.setName("Second Subgroup"); ncg.addSubgroup(sg2); broker.store(ncg); broker.commitTransaction();
I would assume that after the above code, there would be one NewClientGroup and 2 Subgroups in my client_group table. However, there is only one row, the Second Subgroup. Here is the debug SQL generated:
DEBUG: SQL:INSERT INTO client_group (INN_CLIENT_NB,CLASS_NAME) VALUES (?,?) DEBUG: SQL:UPDATE client_group SET NAME=?,CLASS_NAME=? WHERE group_id
=
?
Am I doing something wrong with my mapping or code? Is it possible to
persist these classes to the same table?
Any help would be appreciated.
Thanks, Wes
--------------------------------------------------------------------- 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]
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
