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]

Reply via email to