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]

Reply via email to