Hi Gautam,
Virgo Smart wrote:
Hello Armin,
Apologies for posting a repeat of a similar problem as mentioned in an earlier post.
I had already posted this one before I recieved the reply to the earlier one.
Looking at the modified class descriptor, I see that the extent-class and anonymous
fields are being dropped.
I think this is ok. However I am not sure if the "super" reference descriptor can point
to the primary key field descriptor of the parent class.
Wouldn't this mean that the PK in the BOOKS / TOYS table would also need to be a
FK pointing to the PK of the THINGS table ?
OJB doesn't handle a "super"-reference like a normal 1:1 reference. It
is not possible to delete or insert only "one part of a super-reference
hierarchy" of a Books/Toys object. Thus the referential integrity of the
DB tables is always guaranteed.
Wouldn't this be illegal in SQL ?
I don't know. Isn't it a special case of a 1:1 reference (the FK is used
as PK)? I use constraints in my test tables and don't have problem with
any DB I use in tests.
regards,
Armin
Thanks and Regards,
Gautam
On Wed, 22 Nov 2006 Armin Waibel wrote :
Hi Gautam,
as said in my previous post in thread "OJB: Identity equals method impl." you should use the
"normal" TPS inheritance without a FK field and without "extent-class" declaration within
TPS (and don't override fields in the sub-classes):
<class-descriptor
class="Thing"
table="THINGS">
<field-descriptor
name="id"
column="ID"
jdbc-type="INTEGER"
primarykey="true"
autoincrement="true"
/>
<field-descriptor
name="name"
column="NAME"
jdbc-type="VARCHAR"
size="255"
/>
<field-descriptor
name="drawerId"
column="DRAWER_ID"
jdbc-type="INTEGER"
access="anonymous"
/>
</class-descriptor>
<class-descriptor
class="Toy"
table="TOYS">
<field-descriptor
name="id"
column="ID"
jdbc-type="INTEGER"
primarykey="true"
autoincrement="false"
/>
<field-descriptor
name="category"
column="CATEGORY"
jdbc-type="VARCHAR"
size="255"
/>
</field-descriptor>
<reference-descriptor
name="super"
class-ref="Thing"
>
<foreignkey field-ref="id"/>
</reference-descriptor>
</class-descriptor>
<class-descriptor
class="Book"
table="BOOKS">
<field-descriptor
name="id"
column="ID"
jdbc-type="INTEGER"
primarykey="true"
autoincrement="false"
/>
<field-descriptor
name="author"
column="AUTHOR"
jdbc-type="VARCHAR"
size="255"
/>
<field-descriptor
name="isbnCode"
column="ISBN_CODE"
jdbc-type="VARCHAR"
size="255"
/>
</field-descriptor>
<reference-descriptor
name="super"
class-ref="Thing"
>
<foreignkey field-ref="id"/>
</reference-descriptor>
</class-descriptor>
<class-descriptor
class="Drawer"
table="DRAWER">
<field-descriptor
name="id"
column="id"
jdbc-type="INTEGER"
primarykey="true"
autoincrement="true"
/>
<collection-descriptor
name="stuffInDrawer"
element-class-ref="Thing"
>
<inverse-foreignkey field-ref="drawerId"/>
</collection-descriptor>
</class-descriptor>
The FK field "drawerId" in class Thing (of the 1:n reference in Drawer) is
declared as anonymous. Please read carefully the section about how anonymous keys work to
avoid problems
http://db.apache.org/ojb/docu/guides/advanced-technique.html#How+do
regards,
Armin
Virgo Smart wrote:
Hello,
I am facing an issue when trying to retrieve the Drawer object.
Instead of retrieving a collection of Toy and Book instances in the
stuffInDrawer attribute, collection containing Thing instances is returned.
Following is the class descriptor that is used.
<class-descriptor
class="Thing"
table="THINGS">
<extent-class class-ref="Toy"/>
<extent-class class-ref="Book"/>
<field-descriptor
name="id"
column="ID"
jdbc-type="INTEGER"
primarykey="true"
autoincrement="true"
/>
<field-descriptor
name="name"
column="NAME"
jdbc-type="VARCHAR"
size="255"
/>
<field-descriptor
name="drawerId"
column="DRAWER_ID"
jdbc-type="INTEGER"
access="anonymous"
/>
</class-descriptor>
<class-descriptor
class="Toy"
table="TOYS">
<field-descriptor
name="id"
column="ID"
jdbc-type="INTEGER"
primarykey="true"
autoincrement="true"
/>
<field-descriptor
name="category"
column="CATEGORY"
jdbc-type="VARCHAR"
size="255"
/>
<field-descriptor
name="parentThingId"
column="THING_ID"
jdbc-type="BIGINT"
access="anonymous"
>
</field-descriptor>
<reference-descriptor
name="super"
class-ref="Thing"
>
<foreignkey field-ref="parentThingId"/>
</reference-descriptor>
</class-descriptor>
<class-descriptor
class="Book"
table="BOOKS">
<field-descriptor
name="id"
column="ID"
jdbc-type="INTEGER"
primarykey="true"
autoincrement="true"
/>
<field-descriptor
name="author"
column="AUTHOR"
jdbc-type="VARCHAR"
size="255"
/>
<field-descriptor
name="isbnCode"
column="ISBN_CODE"
jdbc-type="VARCHAR"
size="255"
/>
<field-descriptor
name="parentThingId"
column="THING_ID"
jdbc-type="BIGINT"
access="anonymous"
>
</field-descriptor>
<reference-descriptor
name="super"
class-ref="Thing"
>
<foreignkey field-ref="parentThingId"/>
</reference-descriptor>
</class-descriptor>
<class-descriptor
class="Drawer"
table="DRAWER">
<field-descriptor
name="id"
column="id"
jdbc-type="INTEGER"
primarykey="true"
autoincrement="true"
/>
<collection-descriptor
name="stuffInDrawer"
element-class-ref="Thing"
>
<inverse-foreignkey field-ref="drawerId"/>
</collection-descriptor>
</class-descriptor>
I have used the table per subclass hierarchy strategy.
I have used SequenceManagerHighLowImpl as the sequence manager. The ids (ID
column) in the TOYS and BOOKS tables are unique when the Drawer object is
stored. In the sense, when a Drawer containing 3 things (2 books and 1 toy) is
stored, the ids stored in THINGS table are 1, 2, and 3, where as the ids stored
in BOOKS table are 1 and 2 and id stored in the TOYS table is 3.
I hope I have provided sufficient details to debug the issue. Could anyone
please point me as to where am I going wrong or if there is any way to
circumvent the problem ?
Thanks and Regards,
Gautam.
---------------------------------------------------------------------
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]