This did indeed solve the problem. In summary, repository.xml has:
- Foreign key field defined in subclasses only
- Relationship defined in subclasses and in superclass
And in Java the relationship accessors are defined in the superclass
only.
I didn't even know that one could put fields or relationships in the
superclass in repository.xml. Thanks for pointing this out, Jakob!
--
Steve Clark
Technology Applications Team
Natural Resources Research Center/USGS
[EMAIL PROTECTED]
(970)226-9291
>>>>> Jakob Braeuchi writes:
Jakob> hi,
Jakob> you'll have to define the relationship to D in the abstract
Jakob> S as well as in the concrete B and C. it has to be defined
Jakob> in S because when navigation from A the descriptor of class
Jakob> S is used to resolve the relationship.
Jakob> i tried this meaningless query :
Jakob> Criteria crit = new Criteria();
Jakob> crit.addLike("allArticlesInGroup.productGroup.groupName",
Jakob> "B%"); QueryByCriteria q =
Jakob> ueryFactory.newQuery(ProductGroupWithAbstractArticles.class,
Jakob> crit, true);
Jakob> if i do not define a relationship in class InterfaceArticle
Jakob> to class ProductGroup the SQL fails. after adding
Jakob> <reference-descriptor name="productGroup" it worked.
Jakob> ...
Jakob> <class-descriptor
Jakob> class="org.apache.ojb.broker.InterfaceArticle">
Jakob> <extent-class
Jakob> class-ref="org.apache.ojb.broker.Article" />
Jakob> <extent-class
Jakob> class-ref="org.apache.ojb.broker.BookArticle" />
Jakob> <extent-class
Jakob> class-ref="org.apache.ojb.broker.CdArticle" />
Jakob> <reference-descriptor
Jakob> name="productGroup"
Jakob> class-ref="org.apache.ojb.broker.ProductGroup"
>>
Jakob> <documentation>this is the reference to an
Jakob> articles
Jakob> productgroup</documentation>
Jakob> <foreignkey field-ref="productGroupId"/>
Jakob> <attribute attribute-name="color"
Jakob> attribute-value="red" />
Jakob> <attribute attribute-name="size"
Jakob> attribute-value="tiny" />
Jakob> </reference-descriptor>
Jakob> </class-descriptor>
Jakob> ...
Jakob> hth jakob
> hi charles, steve,
>
> i do not think that my fix is related to this problem. i propose to move
> the definition of the relationship to the concrete classes.
>
> jakob
>
> Charles Anthony wrote:
>
>> Hi,
>>
>> I have a hunch - quite possibly misplaced - that this may have
>> something to
>> do the bug I reported in the thhread entitled.
>> "Criteria.setClassPath - the saga continues"
>>
>> Although you are using an ODMG query, when the query is parsed, it does
>> generate a standard QueryByCriteria. QueryByCriteria was getting the
>> wrong
>> class descriptor when paths of > 1 sement were used. This would lead
>> to the
>> attribute name being passed to the query, as opposed to the column name.
>>
>> Jakob fixed this in CVS last night.
>>
>> This May Be A Red Herring.
>>
>> Cheers,
>>
>> Charles.
>>
>>
>>> -----Original Message-----
>>> From: Steve Clark [mailto:[EMAIL PROTECTED]
>>> Sent: 03 March 2004 19:56
>>> To: OJB Users List
>>> Subject: Re: Extent problem with ODMG
>>>
>>>
>>> I'm still having this problem, so I'm going to try again.
>>>
>>> Using ODMG, RC5, Oracle 9i.
>>>
>>> Summary:
>>> - Class A has a 1-to-1 relationship 'abs' to an abstract
>>> superclass S
>>> - Class S has concrete subclasses B and C
>>> - Classes B and C share a common relationship 'com' to another
>>> class D; this relationship is defined in the superclass S
>>> - Class D has a property 'p'
>>> - A, B, C, and D map to distinct tables
>>>
>>> I am trying to retrieve all A's which have a given value for 'p' in
>>> the D associated with the related B or C (whichever one it is). So:
>>>
>>> select x from A where A.abs.com.p = ?
>>>
>>> A.abs has type S, the abstract superclass; A.abs.com has type D. This
>>> means that the query needs to generate some sort of interesting join
>>> to check for both possible paths to D (via B or C), knowing that
>>> either B or C will have exactly one row satisfying the join
>>> condition(s). In pseudocode:
>>>
>>> select x from A where
>>> if A.abs instanceof B then ((B) A.abs).com.p = ?
>>> else if A.abs instanceof C then ((C) A.abs).com.p = ?
>>>
>>> Should I expect this to work? The SQL query which is being generated
>>> is not only incorrect but invalid: OJB does not rewrite 'p', and in
>>> fact does not even mention D at all. I assume this has to do with
>>> the fact that the repository doesn't record the presence of the
>>> relationship 'com' in the abstract superclass, but only in the
>>> subclasses. Queries starting from B or C and following the 'com'
>>> relationship work fine. Am I out of luck, or is there some way I can
>>> get a working query out of this?
>>>
>>> thanks for any insights,
>>> Steve Clark
>>> Technology Applications Team
>>> Natural Resources Research Center/USGS
>>> [EMAIL PROTECTED]
>>> (970)226-9291
>>>
>>> PS: Original message below. Name mappings:
>>>
>>> A = PartnerImpl
>>> B = SubSiteImpl
>>> C = TechAssistImpl
>>> D = SiteImpl
>>> S = AccomplishmentImpl
>>>
>>> abs = accomp
>>> com = site
>>> p = habTypeCode
>>>
>>> sc> I'm having a problem with extents in ODMG. OJB is generating
>>> sc> incorrect (and, in fact, invalid) SQL for my OQL query. I'm
>>> sc> using RC5.
>>>
>>> sc> My data model consists of Sites, which have collections of
>>> sc> each of two kinds of Accomplishments (SubSites and
>>> sc> TechAssists). An Accomplishment has a collection of Partners.
>>> sc> In the reverse direction, each Partner is associated with
>>> sc> exactly one Accomplishment (either a SubSite or a TechAssist),
>>> sc> and an Accomplishment knows about its parent Site. My
>>> sc> repository looks like this:
>>>
>>> sc> <!-- - - - - - - Site - - - - - - -->
>>>
>>> sc> <class-descriptor
>>> sc> class="gov.doi.habits.dataobjects.SiteImpl"
>>> sc> table="SITE_DETAIL" proxy="dynamic">
>>>
>>> sc> <field-descriptor
>>> sc> name="siteKey" column="SITE_KEY" jdbc-type="INTEGER"
>>> sc> primarykey="true" autoincrement="true"/>
>>>
>>> sc> <field-descriptor
>>> sc> name="habTypeCode" column="HAB_TYPE_CODE"
>>> sc> jdbc-type="INTEGER" />
>>>
>>> sc> <collection-descriptor
>>> sc> name="subSites"
>>> sc> element-class-ref="gov.doi.habits.dataobjects.SubSiteImpl"
>>> sc>
>>> collection-class="org.apache.ojb.broker.util.collections.Manag
>>> eableArrayList">
>>> sc> <inverse-foreignkey field-ref="siteKey" />
>>> sc> </collection-descriptor>
>>>
>>> sc> <collection-descriptor
>>> sc> name="techAssists"
>>> sc> element-class-ref="gov.doi.habits.dataobjects.TechAssistImpl"
>>> sc>
>>> collection-class="org.apache.ojb.broker.util.collections.Manag
>>> eableArrayList">
>>> sc> <inverse-foreignkey field-ref="siteKey" />
>>> sc> </collection-descriptor>
>>> sc> </class-descriptor>
>>>
>>> sc> <!-- - - - - - - Accomplishment - - - - - - -->
>>>
>>> sc> <class-descriptor
>>> sc> class="gov.doi.habits.dataobjects.AccomplishmentImpl" >
>>>
>>> sc> <extent-class
>>> sc> class-ref="gov.doi.habits.dataobjects.SubSiteImpl" />
>>> sc> <extent-class
>>> sc> class-ref="gov.doi.habits.dataobjects.AssistImpl" />
>>> sc> </class-descriptor>
>>>
>>> sc> <!-- - - - - - - SubSite - - - - - - -->
>>>
>>> sc> <class-descriptor
>>> sc> class="gov.doi.habits.dataobjects.SubSiteImpl"
>>> sc> table="SUB_SITE_DETAIL" proxy="dynamic">
>>>
>>> sc> <field-descriptor
>>> sc> name="accompKey" column="ACCOMP_KEY" jdbc-type="INTEGER"
>>> sc> primarykey="true" autoincrement="true"
>>> sc> sequence-name="SEQ_ACCOMP_DETAIL" />
>>>
>>> sc> <field-descriptor
>>> sc> name="siteKey" column="SITE_KEY" jdbc-type="INTEGER" />
>>>
>>> sc> <reference-descriptor
>>> sc> name="site"
>>> sc> class-ref="gov.doi.habits.dataobjects.SiteImpl">
>>> sc> <foreignkey field-ref="siteKey" />
>>> sc> </reference-descriptor>
>>>
>>> sc> <collection-descriptor
>>> sc> name="partners"
>>> sc> element-class-ref="gov.doi.habits.dataobjects.PartnerImpl"
>>> sc>
>>> collection-class="org.apache.ojb.broker.util.collections.Manag
>>> eableArrayList">
>>> sc> <inverse-foreignkey field-ref="accompKey" />
>>> sc> </collection-descriptor>
>>> sc> </class-descriptor>
>>>
>>> sc> <!-- - - - - - - TechAssist - - - - - - -->
>>>
>>> sc> <class-descriptor
>>> sc> class="gov.doi.habits.dataobjects.TechAssistImpl"
>>> sc> table="ASSIST_DETAIL" proxy="dynamic">
>>>
>>> sc> <field-descriptor
>>> sc> name="accompKey" column="ACCOMP_KEY" jdbc-type="INTEGER"
>>> sc> primarykey="true" autoincrement="true"
>>> sc> sequence-name="SEQ_ACCOMP_DETAIL" />
>>>
>>> sc> <field-descriptor
>>> sc> name="siteKey" column="SITE_KEY" jdbc-type="INTEGER" />
>>>
>>> sc> <reference-descriptor
>>> sc> name="site"
>>> sc> class-ref="gov.doi.habits.dataobjects.SiteImpl">
>>> sc> <foreignkey field-ref="siteKey" />
>>> sc> </reference-descriptor>
>>>
>>> sc> <collection-descriptor
>>> sc> name="partners"
>>> sc> element-class-ref="gov.doi.habits.dataobjects.PartnerImpl"
>>> sc>
>>> collection-class="org.apache.ojb.broker.util.collections.Manag
>>> eableArrayList">
>>> sc> <inverse-foreignkey field-ref="accompKey" />
>>> sc> </collection-descriptor>
>>> sc> </class-descriptor>
>>>
>>> sc> <!-- - - - - - - Partner - - - - - - -->
>>>
>>> sc> <class-descriptor
>>> sc> class="gov.doi.habits.dataobjects.PartnerImpl"
>>> sc> table="PARTNER_DETAIL" proxy="dynamic">
>>>
>>> sc> <field-descriptor
>>> sc> name="partnerKey" column="PARTNER_KEY"
>>> sc> jdbc-type="INTEGER" primarykey="true"
>>> sc> autoincrement="true"/>
>>>
>>> sc> <field-descriptor
>>> sc> name="accompKey" column="ACCOMP_KEY"
>>> sc> jdbc-type="INTEGER"/>
>>>
>>> sc> <reference-descriptor
>>> sc> name="accomp"
>>> sc> class-ref="gov.doi.habits.dataobjects.AccomplishmentImpl">
>>> sc> <foreignkey field-ref="accompKey"/>
>>> sc> </reference-descriptor>
>>> sc> </class-descriptor>
>>>
>>> sc> My query looks like this:
>>>
>>> sc> 15:41:13,896 DEBUG [] accesslayer.JdbcAccessImpl
>>> sc> (JdbcAccessImpl.java:282) - executeQuery : Query from class
>>> sc> gov.doi.habits.dataobjects.PartnerImpl where
>>> sc> [accomp.site.habTypeCode IN [1]]
>>>
>>> sc> Note that partner.accomp is an Accomplishment (the abstract
>>> sc> superclass); both extents (SubSite and TechAssist) have a site
>>> sc> relationship.
>>>
>>> sc> The generated SQL looks like this:
>>>
>>> sc> 15:41:13,901 DEBUG [] sql.SqlGeneratorDefaultImpl
>>> sc> (SqlGeneratorDefaultImpl.java:200) - SQL:SELECT DISTINCT
>>> sc> A0.ACCOMP_KEY,A0.PARTNER_KEY FROM PARTNER_DETAIL
>>> sc> A0,SUB_SITE_DETAIL A1,ASSIST_DETAIL A1E1 WHERE
>>> sc> A0.ACCOMP_KEY=A1.ACCOMP_KEY(+) AND
>>> sc> A0.ACCOMP_KEY=A1E1.ACCOMP_KEY(+) AND ((habTypeCode IN ( ? )
>>> sc> OR habTypeCode IN ( ? )))
>>>
>>> sc> Note that SITE_DETAIL is not even included in the query, and
>>> sc> habTypeCode as a result is not rewritten to the appropriate
>>> sc> column name.
>>>
>>> sc> I think the correct query would be more like this:
>>>
>>> sc> SELECT DISTINCT A0.ACCOMP_KEY,A0.PARTNER_KEY
>>> sc> FROM PARTNER_DETAIL A0,SUB_SITE_DETAIL A1,ASSIST_DETAIL
>>> sc> A1E1,SITE_DETAIL A2 WHERE ((A0.ACCOMP_KEY=A1.ACCOMP_KEY(+)
>>> sc> AND A1.SITE_KEY=A2.SITE_KEY) OR
>>> sc> (A0.ACCOMP_KEY=A1E1.ACCOMP_KEY(+) AND
>>> sc> A1E1.SITE_KEY=A2.SITE_KEY)) AND
>>> sc> (A2.HAB_TYPE_CODE IN ( ? ))
>>>
>>> sc> ... though I'm not sure that's exactly right even.
>>>
>>> sc> Is there a way to get working SQL out of this OQL?
>>>
>>> sc> thanks, -- Steve Clark Technology Applications Team Natural
>>> sc> Resources Research Center/USGS [EMAIL PROTECTED]
>>> sc> (970)226-9291
>>>
>>> sc>
>>> ---------------------------------------------------------------------
>>> sc> To unsubscribe, e-mail: [EMAIL PROTECTED] For
>>> sc> additional commands, e-mail: [EMAIL PROTECTED]
>>>
>>> sc> --
>>> Steve Clark
>>> Technology Applications Team
>>> Natural Resources Research Center/USGS
>>> [EMAIL PROTECTED]
>>> (970)226-9291
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>>> For additional commands, e-mail: [EMAIL PROTECTED]
>>>
>>>
>>
>>
>>
>> ___________________________________________________________
>> HPD Software Ltd. - Helping Business Finance Business
>> Email terms and conditions: www.hpdsoftware.com/disclaimer
>>
>>
>> ---------------------------------------------------------------------
>> 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]