hi jean-baptiste,
ojb already offers auto-retrieve = true in the collection-descriptor to load related objects automatically. an additional feature are the prefetched relationships that allow you to load related object in a single query instead of executing one query for each parent object.
what is the additional benefit of DeepRetrieve ?
jakob
CLARAMONTE Jean-Baptiste schrieb:
I've noticed that OJB doesn't offer a deep retrieve reference service, so I
have developped an utility for retrieving from one reference all the deep
references (and back references). Example :
we have the following model :
[A]<(*)listeA-----(1)b>[B]<(1)b-----(*)listeC>[C]-----(1)d>[D]
/\
(*)listeB
||
(*)listeE
\/
[E]
Supposing we already have retrieved a reference on [A] and now we would like
to retrieve all the references associated from this instance. Using the
DeepRerieve utility the following code will do the job for you :
Criteria crit = new Criteria();
crit.addEqualTo("idA", new Long(0));
QueryByCriteria query = QueryFactory.newQuery(A.class, crit);
A result = (A)broker.getObjectByQuery(query);
DeepRetrieve deepRetrieve = new DeepRetrieve(broker); deepRetrieve.addRetrieveRef("b(listeA).listeC(b).d"); deepRetrieve.addRetrieveRef("b.listeE(listeB)"); deepRetrieve.retrieve(result); Without the DeepRetrieve utility the following code should have been used :
Criteria crit = new Criteria(); crit.addEqualTo("idA", new Long(0));
QueryByCriteria query = QueryFactory.newQuery(A.class, crit); query.addPrefetchedRelationship("b");
A result = (A)broker.getObjectByQuery(query);
broker.retrieveReference(result.getB(), "listeA"); broker.retrieveReference(result.getB(), "listeC"); Iterator iter = result.getB().getListeC().iterator(); while (iter.hasNext()) { C c = (C)iter.next(); broker.retrieveReference(c, "d"); broker.retrieveReference(c, "b"); }
broker.retrieveReference(result.getB(), "listeE"); iter = result.getB().getListeE().iterator(); while (iter.hasNext()) { E e = (E)iter.next(); broker.retrieveReference(e, "listeB"); }
From my first tests this DeepRetrive leads to the same amount of sql query.The code is easier to read. (well from my point of view...)
regards,
JB
--------------------------------------------------------------------- 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]