Re: OJB not returning the correct child types.
Armin Waibel <[email protected]>
| Newsgroups | gmane.comp.jakarta.ojb.user |
|---|---|
| Message-ID | <[email protected]> |
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] >> > > > >