hi thomas,

thanks for clarification.

jakob
----- Original Message -----
From: "Thomas Mahler" <[EMAIL PROTECTED]>
To: "OJB Users List" <[EMAIL PROTECTED]>
Sent: Monday, September 09, 2002 9:39 PM
Subject: Re: RelationshipHelper


> Hi Jakob,
>
> This helper is meant for situations where reference- and
> collection-descriptors are set to auto-retrieve="false".
> And the user wants to load the references by an explicit API call.
>
> We have all necessary stuff in PBImpl. Thus I'm planning to simply
> expose two new methods in the PB interface:
>
> retrieveAllReferences(Object instance)
> retrieveReference(Object instance, String referenceAttribute)
>
> cheers,
> Thomas
>
>
> Jakob Braeuchi wrote:
> > hi,
> >
> > i have to admit i haven't always followed this thread so please forgive
my
> > ignorance.
> > what's the purpose of the relationship helper ?
> > could it be integrated into ojb ?
> >
> > jakob
> >
> > ----- Original Message -----
> > From: "Charles Anthony" <[EMAIL PROTECTED]>
> > To: "'OJB Users List'" <[EMAIL PROTECTED]>
> > Sent: Monday, September 09, 2002 10:45 AM
> > Subject: RE: Anyone up for a "challange" ? :)
> >
> >
> >
> >>>Willingly to share the code - just to see it ? :)
> >>>
> >>>/max
> >>
> >>Voila!
> >>
> >>My RelationshipHelper delegates to a more complex object, the
appropriate
> >>sections of which are detailed below.
> >>
> >>Cheers,
> >>
> >>Charles.
> >>
> >>    /**
> >>     * If the relationship specified is not null, load the the named
> >>     * relationship
> >>     * @param o instance of an object
> >>     * @param relationshipName the name of the relationship to load
> >>     */
> >>    public void loadRelationship(Object o, String relationshipName) {
> >>        PersistenceBroker broker =
> >>PersistenceBrokerFactory.defaultPersistenceBroker();
> >>
> >>        ClassDescriptor cld = broker.getClassDescriptor(o.getClass());
> >>        ObjectReferenceDescriptor rd =
> >>cld.getObjectReferenceDescriptorByName(relationshipName);
> >>        if (rd == null) {
> >>            rd = cld.getCollectionDescriptorByName(relationshipName);
> >>        }
> >>
> >>        if (rd == null) {
> >>            Log.error(this, "loadRelationship - couldn't find
relationship
> >>'" + relationshipName + "'");
> >>        } else {
> >>            PersistentField persistentField = rd.getPersistentField();
> >>            Object currentValue = persistentField.get(o);
> >>            if (currentValue == null) {
> >>                if (rd instanceof CollectionDescriptor) {
> >>                    persistentField.set(o,
> >
> > getCollectionRelationship(broker,
> >
> >>o, relationshipName));
> >>                } else {
> >>                    persistentField.set(o, getReferencedObject(broker,
o,
> >>relationshipName));
> >>                }
> >>            } else {
> >>                Log.debug(this, "loadRelationship - relationship '" +
> >>relationshipName + "' already loaded on " + o);
> >>            }
> >>        }
> >>        broker.close();
> >>    }
> >>
> >>
> >>   /**
> >>     * Get Foreign key query for 1:n collection, by name
> >>     *
> >>     * Largely copied from
> >>org.apache.ojb.broker.singlevm.PersitenceBrokerImpl
> >>     *
> >>     * @return org.apache.ojb.broker.query.Query
> >>     * @param obj
> >>     * @param collectionName name of the collection to build the query
for
> >>     */
> >>    private Query getForeignKeyQuery(PersistenceBroker broker, Object
obj,
> >>String collectionName) {
> >>        ClassDescriptor cld = broker.getClassDescriptor(obj.getClass());
> >>        CollectionDescriptor cod =
> >>cld.getCollectionDescriptorByName(collectionName);
> >>        ClassDescriptor refCld =
> >>broker.getClassDescriptor(cod.getItemClass());
> >>
> >>        Object[] values = cld.getKeyValues(obj);
> >>        FieldDescriptor[] fields =
> >>cod.getForeignKeyFieldDescriptors(refCld);
> >>
> >>        Criteria criteria = new Criteria();
> >>        for (int i = 0; i < fields.length; i++) {
> >>            FieldDescriptor fld = (FieldDescriptor) fields[i];
> >>            criteria.addEqualTo(fld.getAttributeName(), values[i]);
> >>        }
> >>
> >>        if (cod.getOrderBy() != null) {
> >>            criteria.addOrderBy(cod.getOrderBy(), cod.isAscending());
> >>        }
> >>
> >>        Query query = QueryFactory.newQuery(refCld.getClassOfObject(),
> >>criteria, true);
> >>
> >>        return query;
> >>    }
> >>
> >>    private Collection getCollectionRelationship(PersistenceBroker
broker,
> >>Object o, String collectionName) {
> >>        ClassDescriptor cld = broker.getClassDescriptor(o.getClass());
> >>        CollectionDescriptor cod =
> >>cld.getCollectionDescriptorByName(collectionName);
> >>        Class collectionClass = cod.getCollectionClass();
> >>        Collection results = null;
> >>
> >>        Query fkQuery =
> >>getForeignKeyQuery(PersistenceBrokerFactory.defaultPersistenceBroker(),
o,
> >>collectionName);
> >>        if (collectionClass == null) {
> >>            results = broker.getCollectionByQuery(fkQuery);
> >>        } else {
> >>            results = (Collection)
> >>broker.getCollectionByQuery(collectionClass, fkQuery);
> >>        }
> >>        return results;
> >>    }
> >>
> >>    /**
> >>     * Largely copied from
> >>org.apache.ojb.broker.singlevm.PersitenceBrokerImpl
> >>     * @param obj
> >>     * @param referenceName
> >>     * @return
> >>     */
> >>    private Object getReferencedObject(PersistenceBroker broker, Object
> >
> > obj,
> >
> >>String referenceName) {
> >>        ClassDescriptor cd = broker.getClassDescriptor(obj.getClass());
> >>        ObjectReferenceDescriptor rds =
> >>cd.getObjectReferenceDescriptorByName(referenceName);
> >>        Class referencedClass = rds.getItemClass();
> >>        // ensure that top-level extents are used for Identities
> >>
> >>        referencedClass =
> >>broker.getDescriptorRepository().getExtentClass(referencedClass);
> >>
> >>        Object[] pkVals = rds.getForeignKeyValues(obj, cd);
> >>
> >>        boolean allPkNull = true;
> >>
> >>        // BRJ : check if we have non null pk values
> >>        for (int i = 0; i < pkVals.length; i++) {
> >>            if (pkVals[i] != null) {
> >>                allPkNull = false;
> >>                break;
> >>            }
> >>        }
> >>
> >>        // BRJ : if all pk values are null there's no referenced object
> >>        if (allPkNull) {
> >>            return null;
> >>        } else {
> >>            Identity id = new Identity(referencedClass, pkVals);
> >>            return broker.getObjectByIdentity(id);
> >>        }
> >>    }
> >>
> >>
> >>
> >>
> >>
> >>
> >>>-----Original Message-----
> >>>From: Max Rydahl Andersen [mailto:[EMAIL PROTECTED]]
> >>>Sent: 09 September 2002 09:35
> >>>To: OJB Users List
> >>>Subject: Re: Anyone up for a "challange" ? :)
> >>>
> >>>
> >>>Willingly to share the code - just to see it ? :)
> >>>
> >>>/max
> >>>
> >>>----- Original Message -----
> >>>From: "Charles Anthony" <[EMAIL PROTECTED]>
> >>>To: "'OJB Users List'" <[EMAIL PROTECTED]>
> >>>Sent: Monday, September 09, 2002 9:31 AM
> >>>Subject: RE: Anyone up for a "challange" ? :)
> >>>
> >>>
> >>>
> >>>>[snippety-snip]
> >>>>
> >>>>>crystal clear! This relationship helper is something I have thought
> >>>>>about in the last week. As all needed functionality is already
> >>>>>implemented in the PersistenceBroker it will be pretty easy
> >>>>
> >>>to expose
> >>>
> >>>>>such a feature in the public API.
> >>>>>I will put this feature on my personal todo list.
> >>>>
> >>>>Cool; spookily, I have a RelationshipHelper class, that has a
> >>>>lazilyLoadRelationship(Object o, String relationshipName),
> >>>
> >>>which basically
> >>>
> >>>>delegates clones of the appropriate methods on the PB. It'd
> >>>
> >>>be good to
> >>>kick
> >>>
> >>>>out the cut-n-paste code re-use !
> >>>>
> >>>>Chers,
> >>>>
> >>>>Charles.
> >>>>
> >>>>
> >>>>This email and any attachments are strictly confidential and
> >>>
> >>>are intended
> >>>
> >>>>solely for the addressee. If you are not the intended
> >>>
> >>>recipient you must
> >>>
> >>>>not disclose, forward, copy or take any action in reliance
> >>>
> >>>on this message
> >>>
> >>>>or its attachments. If you have received this email in error
> >>>
> >>>please notify
> >>>
> >>>>the sender as soon as possible and delete it from your
> >>>
> >>>computer systems.
> >>>
> >>>>Any views or opinions presented are solely those of the
> >>>
> >>>author and do not
> >>>
> >>>>necessarily reflect those of HPD Software Limited or its affiliates.
> >>>>
> >>>> At present the integrity of email across the internet cannot be
> >>>
> >>>guaranteed
> >>>
> >>>>and messages sent via this medium are potentially at risk.
> >>>
> >>>All liability
> >>>
> >>>>is excluded to the extent permitted by law for any claims
> >>>
> >>>arising as a re-
> >>>
> >>>>sult of the use of this medium to transmit information by or to
> >>>>HPD Software Limited or its affiliates.
> >>>>
> >>>>
> >>>>
> >>>>--
> >>>>To unsubscribe, e-mail:
> >>>
> >>><mailto:[EMAIL PROTECTED]>
> >>>
> >>>>For
> >>>
> >>>additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
> >>>
> >>>>
> >>>
> >>>--
> >>>To unsubscribe, e-mail:
> >>><mailto:[EMAIL PROTECTED]>
> >>>For
> >>>additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
> >>>
> >>
> >>This email and any attachments are strictly confidential and are
intended
> >>solely for the addressee. If you are not the intended recipient you must
> >>not disclose, forward, copy or take any action in reliance on this
message
> >>or its attachments. If you have received this email in error please
notify
> >>the sender as soon as possible and delete it from your computer systems.
> >>Any views or opinions presented are solely those of the author and do
not
> >>necessarily reflect those of HPD Software Limited or its affiliates.
> >>
> >> At present the integrity of email across the internet cannot be
> >
> > guaranteed
> >
> >>and messages sent via this medium are potentially at risk.  All
liability
> >>is excluded to the extent permitted by law for any claims arising as a
re-
> >>sult of the use of this medium to transmit information by or to
> >>HPD Software Limited or its affiliates.
> >>
> >>
> >>
> >>--
> >>To unsubscribe, e-mail:
<mailto:[EMAIL PROTECTED]>
> >>For additional commands, e-mail:
<mailto:[EMAIL PROTECTED]>
> >>
> >
> >
> > --
> > To unsubscribe, e-mail:
<mailto:[EMAIL PROTECTED]>
> > For additional commands, e-mail:
<mailto:[EMAIL PROTECTED]>
> >
> >
> >
> >
>
>
>
> --
> To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
>


--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to