hi roger,

i did some test using the latest from repository:

Article
- BookArticle
- AbstractCdArticle
-- CdArticle
--- CdSubArticle (mapping to table artikel for this test to keep it simple)

i also enabled debugging on PersistenceBrokerImpl (inOJB.properties)

the result looks imo not too bad. selects are done for each of the concrete classes:

[org.apache.ojb.broker.singlevm.PersistenceBrokerImpl] DEBUG: Creating one RsIterator per extent class of [org.apache.ojb.broker.Article]
1049309678343|109|0|statement|SELECT A0.Einzelpreis,A0.Kategorie_Nr,A0.Auslaufartikel,A0.MindestBestand,A0.Lagerbestand,A0.Artikel_Nr,A0.Liefereinheit,A0.BestellteEinheiten,A0.Lieferanten_Nr,A0.Artikelname FROM Artikel A0 WHERE A0.Einzelpreis >= (SELECT avg(A0.Einzelpreis) FROM Artikel A0) |SELECT A0.Einzelpreis,A0.Kategorie_Nr,A0.Auslaufartikel,A0.MindestBestand,A0.Lagerbestand,A0.Artikel_Nr,A0.Liefereinheit,A0.BestellteEinheiten,A0.Lieferanten_Nr,A0.Artikelname FROM Artikel A0 WHERE A0.Einzelpreis >= (SELECT avg(A0.Einzelpreis) FROM Artikel A0)
[org.apache.ojb.broker.singlevm.PersistenceBrokerImpl] DEBUG: Adding RsIterator of class [class org.apache.ojb.broker.BookArticle] to ChainingRsIterator
1049309680718|0|0|statement|SELECT A0.Einzelpreis,A0.Kategorie_Nr,A0.ISBN,A0.AUTHOR,A0.Auslaufartikel,A0.MindestBestand,A0.Lagerbestand,A0.Artikel_Nr,A0.Liefereinheit,A0.BestellteEinheiten,A0.Lieferanten_Nr,A0.Artikelname FROM BOOKS A0 WHERE A0.Einzelpreis >= (SELECT avg(A0.Einzelpreis) FROM Artikel A0) |SELECT A0.Einzelpreis,A0.Kategorie_Nr,A0.ISBN,A0.AUTHOR,A0.Auslaufartikel,A0.MindestBestand,A0.Lagerbestand,A0.Artikel_Nr,A0.Liefereinheit,A0.BestellteEinheiten,A0.Lieferanten_Nr,A0.Artikelname FROM BOOKS A0 WHERE A0.Einzelpreis >= (SELECT avg(A0.Einzelpreis) FROM Artikel A0)
[org.apache.ojb.broker.singlevm.PersistenceBrokerImpl] DEBUG: Adding RsIterator of class [class org.apache.ojb.broker.AbstractCdArticle] to ChainingRsIterator
[org.apache.ojb.broker.singlevm.PersistenceBrokerImpl] DEBUG: Creating one RsIterator per extent class of [org.apache.ojb.broker.AbstractCdArticle]
[org.apache.ojb.broker.singlevm.PersistenceBrokerImpl] DEBUG: Adding RsIterator of class [class org.apache.ojb.broker.CdArticle] to ChainingRsIterator
[org.apache.ojb.broker.singlevm.PersistenceBrokerImpl] DEBUG: Creating one RsIterator per extent class of [org.apache.ojb.broker.CdArticle]
1049309682171|0|0|statement|SELECT A0.Einzelpreis,A0.Kategorie_Nr,A0.LABEL,A0.MUSICIANS,A0.Auslaufartikel,A0.MindestBestand,A0.Lagerbestand,A0.Artikel_Nr,A0.Liefereinheit,A0.BestellteEinheiten,A0.Lieferanten_Nr,A0.Artikelname FROM CDS A0 WHERE A0.Einzelpreis >= (SELECT avg(A0.Einzelpreis) FROM Artikel A0) |SELECT A0.Einzelpreis,A0.Kategorie_Nr,A0.LABEL,A0.MUSICIANS,A0.Auslaufartikel,A0.MindestBestand,A0.Lagerbestand,A0.Artikel_Nr,A0.Liefereinheit,A0.BestellteEinheiten,A0.Lieferanten_Nr,A0.Artikelname FROM CDS A0 WHERE A0.Einzelpreis >= (SELECT avg(A0.Einzelpreis) FROM Artikel A0)
[org.apache.ojb.broker.singlevm.PersistenceBrokerImpl] DEBUG: Adding RsIterator of class [class org.apache.ojb.broker.CdSubArticle] to ChainingRsIterator
1049309683203|172|0|statement|SELECT A0.Einzelpreis,A0.Kategorie_Nr,A0.Auslaufartikel,A0.MindestBestand,A0.Lagerbestand,A0.Artikel_Nr,A0.Liefereinheit,A0.BestellteEinheiten,A0.Lieferanten_Nr,A0.Artikelname FROM Artikel A0 WHERE A0.Einzelpreis >= (SELECT avg(A0.Einzelpreis) FROM Artikel A0) |SELECT A0.Einzelpreis,A0.Kategorie_Nr,A0.Auslaufartikel,A0.MindestBestand,A0.Lagerbestand,A0.Artikel_Nr,A0.Liefereinheit,A0.BestellteEinheiten,A0.Lieferanten_Nr,A0.Artikelname FROM Artikel A0 WHERE A0.Einzelpreis >= (SELECT avg(A0.Einzelpreis) FROM Artikel A0)



jakob


Jakob Braeuchi wrote:

hi roger,

i assume you're using the latest from repository and not 0.9.7 as indicated in the title ?

jakob

Janssen, Roger wrote:

could you please provide some sql ?

jakob


Hi, here is some more info!

An excerpt of our object hierarchie is:

         ......
        |
    LifecycleManagedObject (abstract class)
        |
       BusinessObject  (abstract class)
       /      |      \
      Permit   Asset    Organization
                        |
                      Project
       Querying for BusinessObject, the SQL trace is shown below.
First a count is issued, which gives the correct result.
Second, we try to retrieve the objects. We observe that (correctly) four
queries are issued for the four concrete classes. We have persistent
permit's,
organizations and projects, but we do not have assets!.

In the trace we observe that after the four base queries, then some 20000+
queries are issued to retrieve all referenced objects in the (complex)
object tree. I skipped loads of them (not relevant) so i just show you the beginning and the end.
We see that it finishes with retrieving some abstract attributes for a
Permit,
but then commits and stops.
It does not start on the Assets (correct there are none) and does not
continue with
the Organizations and Project (incorrect).


Mapping used:
    <class-descriptor class="ibanx.object.LifecycleManagedObject">
        <extent-class class-ref="ibanx.object.BusinessObject"/>
    </class-descriptor>

    <class-descriptor class="ibanx.object.BusinessObject">
        <extent-class class-ref="ibanx.permit.Permit"/>
        <extent-class class-ref="ibanx.asset.Asset"/>
        <extent-class class-ref="ibanx.org.Organization"/>
    </class-descriptor>

    <class-descriptor class="ibanx.org.Organization">
        <extent-class class-ref="ibanx.project.Project"/>
        ........
        field and reference descriptors
        ........
    </class-descriptor>


When I switch the mapping around (place organization before asset) i will get a correct result!
When I keep the original order, but replace ibanx.asset.Asset (our
implementation) with ibanx.asset.AssetIF (our interface), first all classes
below BusinessObject are processed (i.e. Permit, Organization, the latter
also implying Project) after which the interfaced will be processed extended by ibanx.asset.Asset. And, you'll probably guessed it, I will get a correct result!


Also, with the original mapping querying for LifecycleManagedObject, instead of BusinessObject, I will get a correct result!

IT LEADS ME TO CONCLUDE THAT:
    Whenever i query for an INTERFACE/ABSTRACT CLASS (1), querying
    will stop at the first concrete extend-class of (1) that has no
    instances persistent!

I was able to reproduce this behaviour at several levels of our object (tree) hierarchie with different object classes.


I stated 'INTERFACE/ABSTRACT CLASS' because like described above we also have

            AbstractAttribute            /         |      \
PermitAbstractAttribute  |      ProjectAbstractAttribute
                        |
               AssetAbstractAttribute

(all the classes are concrete)

with mapping

<class-descriptor class="ibanx.object.AbstractAttribute" >
<extent-class class-ref="ibanx.permit.PermitAbstractAttribute"/>
<extent-class class-ref="ibanx.asset.AssetAbstractAttribute"/>
<extent-class
class-ref="ibanx.project.ProjectAbstractAttribute"/>
........
field and reference descriptors
........
</class-descriptor>
Again we do have instances of AbstractAttribute, PermitAbstractAttribute and
ProjectAbstractAttribute, but this time, querying for AbstractAttribute
delivers me the right result!



SQL Trace:


- first a count, with the correct result

1049193852156|0|0|statement||SELECT count(*) FROM IBANX_PERMIT A0
1049193852156|0|0|statement||SELECT count(*) FROM IBANX_ASSET A0
1049193852171|0|0|statement||SELECT count(*) FROM IBANX_ORGANIZATION A0
1049193852171|0|0|statement||SELECT count(*) FROM IBANX_PROJECT A0
1049193852171|0|0|commit||

- second, the retrieval of the objects

1049193852484|0|1|statement||SELECT DISTINCT
A0.DATE_MODIFIED,A0.PLANNED_START_DATE,A0.LOCATION,A0.WORK_HOURS_TO,A0.DATE_
CREATED,A0.PRODUCT_INFO_ID,A0.ENTITY_CLASS,A0.MODIFIED_BY,A0.CREATED_BY,A0.R
ISC_ID,A0.PRODUCT,A0.PROJECT,A0.ORG_UNIT,A0.LIFECYCLE_ID,A0.PLANNED_END_DATE
,A0.RISC_CATEGORY,A0.LAST_MODIFICATION,A0.ID,A0.PREVIOUS_STATE_ID,A0.WORK_HO
URS_FROM,A0.TITLE,A0.NUMBER,A0.ORG_CONTEXT,A0.STATE_ID,A0.ACL_ID,A0.BO_TYPE_
ID,A0.WORK_ORDER_NR,A0.ENABLED,A0.EQUIPMENT_NR FROM IBANX_PERMIT A0
1049193852484|0|1|statement||SELECT DISTINCT
A0.DATE_MODIFIED,A0.LOCATION,A0.DATE_CREATED,A0.ENTITY_CLASS,A0.MODIFIED_BY,
A0.CREATED_BY,A0.AREA,A0.ZONE,A0.PROJECT,A0.LIFECYCLE_ID,A0.NAME,A0.LAST_MOD
IFICATION,A0.ID,A0.PREVIOUS_STATE_ID,A0.EXT_CODE,A0.NUMBER,A0.ORG_CONTEXT,A0
.STATE_ID,A0.ACL_ID,A0.DEPARTMENT,A0.BO_TYPE_ID,A0.ENABLED FROM IBANX_ASSET
A0
1049193852484|0|1|statement||SELECT DISTINCT
A0.CREATED_BY,A0.ID,A0.MODIFIED_BY,A0.DATE_CREATED,A0.ENTITY_CLASS,A0.NUMBER
,A0.DATE_MODIFIED,A0.NAME FROM IBANX_ORGANIZATION A0
1049193852484|0|1|statement||SELECT DISTINCT
A0.DATE_MODIFIED,A0.PLANNED_START_DATE,A0.DATE_CREATED,A0.ENTITY_CLASS,A0.MO
DIFIED_BY,A0.CREATED_BY,A0.LIFECYCLE_ID,A0.PLANNED_END_DATE,A0.NAME,A0.CATEG
ORY,A0.CONTACT,A0.LAST_MODIFICATION,A0.ID,A0.PREVIOUS_STATE_ID,A0.DESCRIPTIO
N,A0.NUMBER,A0.ORG_CONTEXT,A0.HOMEPAGE,A0.STATE_ID,A0.ACL_ID,A0.BO_TYPE_ID,A
0.ENABLED FROM IBANX_PROJECT A0
1049193852500|0|1|statement|SELECT
ENTITY_CLASS,ORG_CONTEXT,ACL_ID,DESCRIPTION,ID,OBJECT_CLASS,ACL_DOMAIN,LAST_
MODIFICATION,ENABLED,GENERATED,NAME FROM IBANX_ACL WHERE ID = ? |SELECT
ENTITY_CLASS,ORG_CONTEXT,ACL_ID,DESCRIPTION,ID,OBJECT_CLASS,ACL_DOMAIN,LAST_
MODIFICATION,ENABLED,GENERATED,NAME FROM IBANX_ACL WHERE ID = '1135' 1049193852531|0|1|statement|SELECT
A0.ID,A0.PERMISSION,A0.ACL_ID,A0.ENTITY_CLASS,A0.LAST_MODIFICATION,A0.TRUSTE
E,A0.TRUSTEE_TYPE FROM IBANX_TRUSTEE_PERMISSION A0 WHERE A0.ACL_ID = ?
ORDER BY 6|SELECT
A0.ID,A0.PERMISSION,A0.ACL_ID,A0.ENTITY_CLASS,A0.LAST_MODIFICATION,A0.TRUSTE
E,A0.TRUSTEE_TYPE FROM IBANX_TRUSTEE_PERMISSION A0 WHERE A0.ACL_ID = '1135'
ORDER BY 6
1049193852531|0|1|statement|SELECT
SEARCH_TEMPLATE,EDIT_TEMPLATE,ORG_CONTEXT,NUMBER,LIFECYCLE_ID,TEMPLATE_ID,CO
PY_TEMPLATE,ACL_ID,VIEW_TEMPLATE,DESCRIPTION,ID,CREATE_TEMPLATE,OBJECT_CLASS
,LAST_MODIFICATION,ENABLED,NAME FROM IBANX_BUSINESSOBJECT_TYPE WHERE ID = ?
|SELECT
SEARCH_TEMPLATE,EDIT_TEMPLATE,ORG_CONTEXT,NUMBER,LIFECYCLE_ID,TEMPLATE_ID,CO
PY_TEMPLATE,ACL_ID,VIEW_TEMPLATE,DESCRIPTION,ID,CREATE_TEMPLATE,OBJECT_CLASS
,LAST_MODIFICATION,ENABLED,NAME FROM IBANX_BUSINESSOBJECT_TYPE WHERE ID =
'1255' 1049193852531|0|1|statement|SELECT
ENTITY_CLASS,ORG_CONTEXT,ACL_ID,DESCRIPTION,ID,OBJECT_CLASS,ACL_DOMAIN,LAST_
MODIFICATION,ENABLED,GENERATED,NAME FROM IBANX_ACL WHERE ID = ? |SELECT
ENTITY_CLASS,ORG_CONTEXT,ACL_ID,DESCRIPTION,ID,OBJECT_CLASS,ACL_DOMAIN,LAST_
MODIFICATION,ENABLED,GENERATED,NAME FROM IBANX_ACL WHERE ID = '1001'
..... some 20000+ queries removed....


1049193865937|0|1|statement|SELECT
EXCEPTION_STATE,ENTITY_CLASS,ORG_CONTEXT,STATE_ACL_ID,NUMBER,LIFECYCLE_ID,TE
MPLATE_ID,ACL_ID,SEQ_ORDER,DESCRIPTION,ID,LAST_MODIFICATION,SIGN_REQUIRED,NE
XT_STATE_ID,PREV_STATE_ID,ENABLED,NAME FROM IBANX_LIFECYCLE_STATE WHERE ID =
? |SELECT
EXCEPTION_STATE,ENTITY_CLASS,ORG_CONTEXT,STATE_ACL_ID,NUMBER,LIFECYCLE_ID,TE
MPLATE_ID,ACL_ID,SEQ_ORDER,DESCRIPTION,ID,LAST_MODIFICATION,SIGN_REQUIRED,NE
XT_STATE_ID,PREV_STATE_ID,ENABLED,NAME FROM IBANX_LIFECYCLE_STATE WHERE ID =
'1236' 1049193865937|0|1|statement|SELECT
ENTITY_CLASS,ORG_CONTEXT,ACL_ID,DESCRIPTION,ID,OBJECT_CLASS,ACL_DOMAIN,LAST_
MODIFICATION,ENABLED,GENERATED,NAME FROM IBANX_ACL WHERE ID = ? |SELECT
ENTITY_CLASS,ORG_CONTEXT,ACL_ID,DESCRIPTION,ID,OBJECT_CLASS,ACL_DOMAIN,LAST_
MODIFICATION,ENABLED,GENERATED,NAME FROM IBANX_ACL WHERE ID = '1135' 1049193865937|0|1|statement|SELECT
A0.ID,A0.PERMISSION,A0.ACL_ID,A0.ENTITY_CLASS,A0.LAST_MODIFICATION,A0.TRUSTE
E,A0.TRUSTEE_TYPE FROM IBANX_TRUSTEE_PERMISSION A0 WHERE A0.ACL_ID = ?
ORDER BY 6|SELECT
A0.ID,A0.PERMISSION,A0.ACL_ID,A0.ENTITY_CLASS,A0.LAST_MODIFICATION,A0.TRUSTE
E,A0.TRUSTEE_TYPE FROM IBANX_TRUSTEE_PERMISSION A0 WHERE A0.ACL_ID = '1135'
ORDER BY 6
1049193865937|0|1|statement|SELECT
EXCEPTION_STATE,ENTITY_CLASS,ORG_CONTEXT,STATE_ACL_ID,NUMBER,LIFECYCLE_ID,TE
MPLATE_ID,ACL_ID,SEQ_ORDER,DESCRIPTION,ID,LAST_MODIFICATION,SIGN_REQUIRED,NE
XT_STATE_ID,PREV_STATE_ID,ENABLED,NAME FROM IBANX_LIFECYCLE_STATE WHERE ID =
? |SELECT
EXCEPTION_STATE,ENTITY_CLASS,ORG_CONTEXT,STATE_ACL_ID,NUMBER,LIFECYCLE_ID,TE
MPLATE_ID,ACL_ID,SEQ_ORDER,DESCRIPTION,ID,LAST_MODIFICATION,SIGN_REQUIRED,NE
XT_STATE_ID,PREV_STATE_ID,ENABLED,NAME FROM IBANX_LIFECYCLE_STATE WHERE ID =
'-1' 1049193865937|0|1|statement|SELECT
EXCEPTION_STATE,ENTITY_CLASS,ORG_CONTEXT,STATE_ACL_ID,NUMBER,LIFECYCLE_ID,TE
MPLATE_ID,ACL_ID,SEQ_ORDER,DESCRIPTION,ID,LAST_MODIFICATION,SIGN_REQUIRED,NE
XT_STATE_ID,PREV_STATE_ID,ENABLED,NAME FROM IBANX_LIFECYCLE_STATE WHERE ID =
? |SELECT
EXCEPTION_STATE,ENTITY_CLASS,ORG_CONTEXT,STATE_ACL_ID,NUMBER,LIFECYCLE_ID,TE
MPLATE_ID,ACL_ID,SEQ_ORDER,DESCRIPTION,ID,LAST_MODIFICATION,SIGN_REQUIRED,NE
XT_STATE_ID,PREV_STATE_ID,ENABLED,NAME FROM IBANX_LIFECYCLE_STATE WHERE ID =
'-1' 1049193865937|0|1|statement|SELECT
A0.ID,A0.DESCRIPTION,A0.OID,A0.LAST_MODIFICATION,A0.VALUE,A0.NAME FROM
IBANX_PERMIT_ABSTRACT_ATTRIBUTE A0 WHERE A0.OID = ? ORDER BY 6|SELECT
A0.ID,A0.DESCRIPTION,A0.OID,A0.LAST_MODIFICATION,A0.VALUE,A0.NAME FROM
IBANX_PERMIT_ABSTRACT_ATTRIBUTE A0 WHERE A0.OID = '1511' ORDER BY 6
1049193865937|0|1|commit||


Hope this helps and i didn't bury you with to much info!

thanx,

Roger Janssen
ibanx



*************************************************************************
The information contained in this communication is confidential and is
intended solely for the use of the individual or entity to whom it is
addressed.You should not copy, disclose or distribute this communication without the authority of iBanx bv. iBanx bv is neither liable for the proper and complete transmission of the information has been maintained
nor that the communication is free of viruses, interceptions or interference.


If you are not the intended recipient of this communication please return
the communication to the sender and delete and destroy all copies.


---------------------------------------------------------------------
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