hi,
we are planning to migrate to the latest release very soon (maybe even next
week).
until then i'm not able to test it on a version newer than 0.9.7. (sorry for
that)
>the result looks imo not too bad. selects are done for each of the
>concrete classes:
selects are done in some cases but, suppose an article had bookarticle and
cdarticle;
Article (abstract)
- BookArticle (concrete)
- CdArticle (concrete)
If both book and cd articles have instances, no problem!
If only cdarticle has instances and it appears after bookarticle in the
mapping;
Article
extend-class BookArticle
extend-class CdArticle
then querying for article returns nothing, where it should.
Again, in the same case, if i were to do:
ArticleInterface
extend-class Article
Article
extend-class BookArticle
extend-class CdArticle
and i would query for ArticleInterface, all goes well again!
This is what i observe within our app (i translated it to above example).
roger
-----Original Message-----
From: Jakob Braeuchi [mailto:[EMAIL PROTECTED]
Sent: woensdag 2 april 2003 21:06
To: OJB Users List
Subject: Re: FW: Encountered (serious) bug in v0.9.7, don't know if it
as been fix ed in later version
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.Lagerb
estand,A0.Artikel_Nr,A0.Liefereinheit,A0.BestellteEinheiten,A0.Lieferanten_N
r,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.Lagerb
estand,A0.Artikel_Nr,A0.Liefereinheit,A0.BestellteEinheiten,A0.Lieferanten_N
r,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.Mindes
tBestand,A0.Lagerbestand,A0.Artikel_Nr,A0.Liefereinheit,A0.BestellteEinheite
n,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.Mindes
tBestand,A0.Lagerbestand,A0.Artikel_Nr,A0.Liefereinheit,A0.BestellteEinheite
n,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.Mi
ndestBestand,A0.Lagerbestand,A0.Artikel_Nr,A0.Liefereinheit,A0.BestellteEinh
eiten,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.Mi
ndestBestand,A0.Lagerbestand,A0.Artikel_Nr,A0.Liefereinheit,A0.BestellteEinh
eiten,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.Lagerb
estand,A0.Artikel_Nr,A0.Liefereinheit,A0.BestellteEinheiten,A0.Lieferanten_N
r,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.Lagerb
estand,A0.Artikel_Nr,A0.Liefereinheit,A0.BestellteEinheiten,A0.Lieferanten_N
r,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]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]