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