So, changing the class descriptor for B to read something like:
<class-descriptor class="polymorphtest.B" table="B_TABLE">
<field-descriptor name="id" column="ID" jdbc-type="INTEGER"
primarykey="true"
autoincrement="true" />
<field-descriptor name="a_id" column="A_ID" jdbc-type="INTEGER"/>
<field-descriptor name="someValueFromB" column="VALUE_"
jdbc-type="INTEGER" />
<reference-descriptor name="super" class-ref="polymorphtest.A">
<foreignkey field-ref="a_id" />
</reference-descriptor>
</class-descriptor>
should clear up any ambiguity and give me behavior more in-line with my original
message, yes? Thanks for your help!
> -----Original Message-----
> From: Jakob Braeuchi [mailto:[EMAIL PROTECTED]
> Sent: Sunday, October 19, 2003 3:26 AM
> To: OJB Users List
> Subject: Re: Wrong class materialized when selecting from an extent
> mapped to a multi-table join
>
>
> hi justis,
>
> ojb needs the pk to be unique within a hierarchy.
> Identity#equals just
> checks for the toplevel class not the real class, that's why.
> changing
> this behaviour is delicate.
>
> afaik the tutorial simply uses the super-reference (with the same pk)
> but it does _not_ use extent-definitions. so the classes do
> not belong
> to the same hierarchy and thus an identical pk does not hurt.
>
> jakob
>
> Justis Peters wrote:
> > Hi Jakob,
> >
> > The answers you provide Burt imply that it is possible to
> do exactly what I am trying to do. What is it that I am
> doing wrong? My test cases seem to follow exactly what Burt is doing.
> >
> > Also, I do not understand your comment about the primary
> key needing to be unique. The tutorial specifically
> recommends using the same primary key for both, in order to
> link the rows together. In the case we are discussing below,
> the data in A_TABLE is not an object referenced by B_TABLE --
> it is actually the data that comprises the remainder of
> B_TABLE. It is just stored in A_TABLE instead, to avoid
> redundancy and to allow for selecting from the entire extent
> when using tools other than OJB.
> >
> > Am I misunderstanding something? I realize that the
> current implementation of the super-reference does not do
> what I am requesting. It seems to me, though, that it should
> eventually do this.
> >
> > Thanks in advance for your reply!
> >
> > Sincerely yours,
> > Justis Peters
> > Oculan Corp.
> > [EMAIL PROTECTED]
> >
> > Jakob Braeuchi [EMAIL PROTECTED] wrote:
> >
> >>hi burt,
> >>
> >>1.) this is partly correct:
> >>three queries will be executed to load the extents.
> problems could arise
> >>when materializing the objects. ojb assumes that a primary key is
> >>_unique_ within a class hierarchy. if this is not true the
> wrong object
> >>will be returned. this could be solved here by _not_ using
> the pk in
> >>super-reference.
> >>
> >>2.) same problem as in 1.)
> >>
> >>3.) that's true atm.
> >>
> >>4.) also true if the auto-settings of the reference
> descriptor are not
> >>set to false.
> >>
> >>jakob
> >>
> >>BURT, RANDALL (CONTRACTOR) wrote:
> >>
> >>
> >>>Jumping in late, but its germane to what I'm working on.
> So, if I read
> >>>what everyone is saying correctly, the following:
> >>>
> >>><class-descriptor class="polymorphtest.InterfaceA">
> >>> <extent-class class-ref="polymorphtest.A" />
> >>> <extent-class class-ref="polymorphtest.B" />
> >>> <extent-class class-ref="polymorphtest.C" />
> >>></class-descriptor>
> >>>
> >>><class-descriptor class="polymorphtest.A" table="A_TABLE">
> >>> <extent-class class-ref="polymorphtest.B" />
> >>> <field-descriptor name="id" column="ID" jdbc-type="INTEGER"
> >>> primarykey="true"
> autoincrement="true" />
> >>> <field-descriptor name="someValueFromA" column="VALUE_"
> >>> jdbc-type="INTEGER" />
> >>></class-descriptor>
> >>>
> >>><class-descriptor class="polymorphtest.B" table="B_TABLE">
> >>> <field-descriptor name="id" column="ID" jdbc-type="INTEGER"
> >>> primarykey="true"
> autoincrement="true" />
> >>> <field-descriptor name="someValueFromB" column="VALUE_"
> >>> jdbc-type="INTEGER" />
> >>> <reference-descriptor name="super" class-ref="polymorphtest.A">
> >>> <foreignkey field-ref="id" />
> >>> </reference-descriptor>
> >>></class-descriptor>
> >>>
> >>><class-descriptor class="polymorphtest.C" table="C_TABLE">
> >>> <field-descriptor name="id" column="ID" jdbc-type="INTEGER"
> >>> primarykey="true"
> autoincrement="true" />
> >>> <field-descriptor name="someValueFromC" column="VALUE_"
> >>> jdbc-type="INTEGER" />
> >>></class-descriptor>
> >>>
> >>>does not do what I would expect? :
> >>>
> >>>1. Queries for collections of InterfaceA would give me all
> the A's, B's,
> >>>and C's.
> >>>2. Queries for collections of A's would give me A's and
> B's, but the A's
> >>>would be only those rows in A_TABLE that did not have
> matching keys in
> >>>B_TABLE.
> >>>3. If I queried for an A, but there is a B that matches,
> I'd get a B and
> >>>not just an A.
> >>>4. Anytime B's are materialized, they would have their inherited
> >>>properties from the super class A populated.
> >>>
> >>>Sorry if this is a re-hash, but I'm getting a little
> confused ATM. Thanks
> >>>for any clarifications.
> >>>
> >>>
> >>>
> >>>>-----Original Message-----
> >>>>From: Jakob Braeuchi [mailto:[EMAIL PROTECTED]
> >>>>Sent: Friday, October 17, 2003 12:09 PM
> >>>>To: OJB Users List; Thomas Mahler; Armin Waibel
> >>>>Subject: Re: Wrong class materialized when selecting from
> an extent
> >>>>mapped to a multi-table join
> >>>>
> >>>>
> >>>>hi justis, wallace,
> >>>>
> >>>>this problem is caused by Identity#equals noch checking
> >>>>objectsRealClass
> >>>>. consider the following situation: a select for InterfaceA
> >>>>fires 2 selects
> >>>>SELECT A0.VALUE_,A0.ID FROM A_TABLE A0
> >>>>retrieving Table_A objects with ids 1 and 2
> >>>>SELECT A0.VALUE_,A0.ID FROM B_TABLE A0 INNER JOIN A_TABLE A1
> >>>>ON A0.ID=A1.ID
> >>>>retrieving Table_B object with id 1
> >>>>
> >>>>when building the objects from the resultset in
> >>>>RsIterator#getObjectFromResultSet an identity is built from
> >>>>the row and
> >>>>looked up in the cache. the object (id = 1) from table_B is
> >>>>considered
> >>>>to be in the cache because the topLevelClass (InterfaceA) and
> >>>>the pk (1)
> >>>>matches !
> >>>>
> >>>>this problem could be solved by also checking the
> objectsRealClass in
> >>>>Identity#equals. i remember there was quite a big
> discussion about
> >>>>Identity, so i'm not sure if this is a correct soluion ??
> >>>>
> >>>>another solution could be to use a dedicated column to
> refer to the
> >>>>super-class in the reference-descriptor. this would avoid the
> >>>>pk-clash
> >>>>in the cache.
> >>>>
> >>>>another way is to completly avoid using extents and
> >>>>super-references ;)
> >>>>
> >>>>
> >>>><class-descriptor class="polymorphtest.InterfaceA">
> >>>> <extent-class class-ref="polymorphtest.A" />
> >>>> <extent-class class-ref="polymorphtest.B" />
> >>>></class-descriptor>
> >>>>
> >>>><class-descriptor class="polymorphtest.A" table="A_TABLE">
> >>>> <field-descriptor name="id" column="ID" jdbc-type="INTEGER"
> >>>>primarykey="true" autoincrement="true" />
> >>>> <field-descriptor name="someValueFromA" column="VALUE_"
> >>>>jdbc-type="INTEGER" />
> >>>></class-descriptor>
> >>>>
> >>>><class-descriptor class="polymorphtest.B" table="B_TABLE">
> >>>> <field-descriptor name="id" column="ID" jdbc-type="INTEGER"
> >>>>primarykey="true" autoincrement="true" />
> >>>> <field-descriptor name="someValueFromB" column="VALUE_"
> >>>>jdbc-type="INTEGER" />
> >>>> <reference-descriptor name="super" class-ref="polymorphtest.A">
> >>>> <foreignkey field-ref="id" />
> >>>> </reference-descriptor>
> >>>></class-descriptor>
> >>>>
> >>>>jakob
> >>>>
> >>>>Justis Peters wrote:
> >>>>
> >>>>
> >>>>
> >>>>>Hi All!
> >>>>>
> >>>>>Just a couple weeks ago I started using OJB, and I am
> >>>>
> >>>>extremely impressed. My gratitude goes to all who put in the
> >>>>work to make it possible.
> >>>>
> >>>>
> >>>>>Upon converting some of the more complicated parts of my
> >>>>
> >>>>object model, I encountered a strange issue. Here is the bug
> >>>>I attempted to submit to scarab. Apparently, scarab is
> >>>>having problems. At first, it assigned an ID to my issue
> >>>>that was already assigned to another issue, so I can't
> >>>>retrieve it. Now, it won't let me enter new issues and keeps
> >>>>directing me to the query page isntead.
> >>>>
> >>>>
> >>>>>Anyhow, here is the summary of the bug. Any help would be
> >>>>
> >>>>appreciated:
> >>>>
> >>>>
> >>>>==============================================================
> >>>>============
> >>>>
> >>>>
> >>>>>When selecting an entire extent from a parent class, the
> >>>>
> >>>>behavior varies depending on whether you are using
> >>>>multi-table joins or distinct tables for each class.
> >>>>Everything seems to work correctly if you use distinct tables
> >>>>for each class. If you are using multi-table joins, however,
> >>>>your objects are not always materialized as the class you
> >>>>would expect. Here is the scenario for the test case I made:
> >>>>
> >>>>
> >>>>>Object model
> >>>>>------------
> >>>>>- public interface InterfaceA
> >>>>>- public class A implements InterfaceA
> >>>>>- public class B extends A implements InterfaceA
> >>>>>
> >>>>>Test case 1
> >>>>>-----------
> >>>>>- start with a new JVM
> >>>>>- select all from extent InterfaceA.class, loop through and
> >>>>
> >>>>display the class for each
> >>>>
> >>>>
> >>>>>- select all from extent A.class, loop through and display
> >>>>
> >>>>the class for each
> >>>>
> >>>>
> >>>>>- select all from extent B.class, loop through and display
> >>>>
> >>>>the class for each
> >>>>
> >>>>
> >>>>>Test case 2
> >>>>>-----------
> >>>>>- restart with a new JVM
> >>>>>- select all from extent B.class, loop through and display
> >>>>
> >>>>the class for each
> >>>>
> >>>>
> >>>>>- select all from extent A.class, loop through and display
> >>>>
> >>>>the class for each
> >>>>
> >>>>
> >>>>>- select all from extent InterfaceA.class, loop through and
> >>>>
> >>>>display the class for each
> >>>>
> >>>>
> >>>>>Results
> >>>>>-------
> >>>>>- If using distinct tables for each class (see schema1.sql
> >>>>
> >>>>and repository_user1.xml), both test cases materialize all
> >>>>objects as the correct subclass and returns the expected
> >>>>instances with the appropriate queries.
> >>>>
> >>>>
> >>>>>- If using multi-table joins (see schema2.sql and
> >>>>
> >>>>repository_user2.xml), test case 1 displays everything as
> >>>>being class "A", even if it was a "B". Instances of "B" are
> >>>>retrieved and displayed twice in the queries for "InstanceA".
> >>>>Once you get to querying for "B", it turns up absolutely no
> >>>>instances. I imagine this is because it is cached. Test
> >>>>case 2 correctly materializes the objects a "B" and "A",
> >>>>depending on which table they appear in; when you query
> >>>>against InterfaceA.class, however, it still displays the
> >>>>duplicates for instances of "B".
> >>>>
> >>>>
> >>>>>For convenience in debugging, I have written a command-line
> >>>>
> >>>>test that lets you choose the order in which the extents are
> >>>>retrieved and displayed. You can run it by doing:
> >>>>
> >>>>
> >>>>> java polymorphtest.PolymorphTest 0 1 2 (test case 1)
> >>>>>OR
> >>>>> java polymorphtest.PolymorphTest 2 1 0 (test case 2)
> >>>>>
> >>>>>
> >>>>>All the related classes, schemas, and O/R mappings are
> >>>>
> >>>>attached to this bug. Please contact me if you need help
> >>>>reproducing the errors.
> >>>>
> >>>>
> >>>>>================================================================
> >>>>>
> >>>>>I don't want to send the attachments to the whole list, but
> >>>>
> >>>>I will be glad to email the tarball to whomever requests it.
> >>>>Thanks in advance for your help!
> >>>>
> >>>>
> >>>>>Sincerely,
> >>>>>Justis Peters
> >>>>>Oculan Corp.
> >>>>>[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]
> >>>
> >>>
> >>
> >>
> >>------------------------------------------------------------
> ---------
> >>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]