You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-user@db.apache.org by Bonnie MacKellar <BM...@mobius.com> on 2003/04/21 22:31:16 UTC

RE: question on auto-retrieve and cacheing behavior for a referen ce descriptor

Fully up to date with respect to the cache or the underlying DBMS?

I guess the way I had read the dtd, I thought that refresh=true would
cause the system to go out and hit the DBMS each time the referring object
was loaded from the DBMS, even if the referred-to object was already
in the cache. In othe words, each time a
Select ... From User 
is generated, an accompanying
Select... from Customer Where customerID = "?"
would also be generated. That is why I did not use it.

But my testing just showed me that, with refresh=true,
the exact same SQL is generated as when refresh was not set at all.
However, when the newly inserted User is printed, its
Customer (which should be in the cache) is accessible, whereas it was not
when refresh was not set. 

Does that make sense?

thanks,
Bonnie MacKellar
software engineer
Mobius Management Systems, Inc.
bmackell@mobius.com


> -----Original Message-----
> From: Ron Gallagher [mailto:rgallagh@bellsouth.net]
> Sent: Monday, April 21, 2003 4:26 PM
> To: ojb-user@db.apache.org
> Subject: Re: question on auto-retrieve and cacheing behavior for a
> referen ce d escriptor
> 
> 
> My understanding of the two settings is this.  More 
> knowledgable persons can step in and correct me anytime they want...
> 
> refresh="true" causes ojb to refresh the collection/reference 
> descriptor immediately before it returns an object instance 
> to the caller.
> 
> auto-retrieve="true" causes ojb to automatically retrieve the 
> collection/descriptor descriptor whenever it's asked to do so.
> 
> The two settings work together when you ask ojb for an 
> object.  If refresh="true" and auto-retrieve="true" for a 
> reference/collection descriptor, then that r/c descriptor 
> will be fully up-to-date whenever the 'containing' object is 
> returned by ojb.
> 
> Ron Gallagher
> Atlanta, GA
> rongallagher@bellsouth.net
> 
> 
> > 
> > From: Bonnie MacKellar <BM...@mobius.com>
> > Date: 2003/04/21 Mon PM 04:17:55 EDT
> > To: OJB Users List <oj...@db.apache.org>
> > Subject: RE: question on auto-retrieve and cacheing 
> behavior for a referen
> > 	ce d	escriptor
> > 
> > OK, I will try that.
> > 
> > Out of curiousity, what is the exact difference between the
> > refresh attribute and the auto-retrieve attribute?
> > 
> > thanks,
> > Bonnie MacKellar
> > software engineer
> > Mobius Management Systems, Inc.
> > bmackell@mobius.com
> > 
> > 
> > > -----Original Message-----
> > > From: Ron Gallagher [mailto:rgallagh@bellsouth.net]
> > > Sent: Monday, April 21, 2003 4:17 PM
> > > To: ojb-user@db.apache.org
> > > Subject: Re: question on auto-retrieve and cacheing behavior for a
> > > reference d escriptor
> > > 
> > > 
> > > Bonnie -- 
> > > 
> > > Try setting refresh="true" on the reference-descriptor
> > > 
> > > From the DTD:
> > > 
> > > "The refresh attribute can be set to true to force OJB to 
> > > refresh object references on instance loading."
> > > 
> > > HTH
> > > 
> > > Ron Gallagher
> > > Atlanta, GA
> > > rongallagher@bellsouth.net
> > > 
> > > 
> > > > 
> > > > From: Bonnie MacKellar <BM...@mobius.com>
> > > > Date: 2003/04/21 Mon PM 04:09:27 EDT
> > > > To: "OJB Users List (E-mail)" <oj...@db.apache.org>
> > > > Subject: question on auto-retrieve and cacheing behavior 
> > > for a reference d
> > > > 	escriptor
> > > > 
> > > > I'm trying to understand  OJB's behavior by looking at the 
> > > SQL queries
> > > > that are generated... I do not understand the behavior in 
> > > this test system.
> > > > 
> > > > I have two classes User and Customer. User has a 1:1 
> relationship to
> > > > Customer :
> > > > public class User {
> > > > 	
> > > > 	private int userID;
> > > > 	protected String loginID;
> > > > 	protected String fname;
> > > > 	protected String mname;
> > > > 	protected String lname;
> > > > 	protected String passwordhash;
> > > > 	protected int roleID;
> > > > 	protected Customer customer;
> > > > 	protected int customerID;
> > > > 	protected String emailAddress;
> > > >  ...}
> > > > 
> > > > This is set up in repository_user.xml like this :
> > > >       <reference-descriptor
> > > >       	name="customer"
> > > >       	class-ref="database.Customer"
> > > >       	auto-retrieve="true"
> > > >       	>
> > > >       	<foreignkey field-ref="customerID"/>
> > > >       </reference-descriptor>
> > > > 
> > > > Now, I have two records in User :
> > > > "fred" who has a customerID of 1
> > > > "susie" who has a customerID of 2
> > > > 
> > > > In Customer, I have
> > > > "acme" with customerID = 1
> > > > "stuff with customerID = 1
> > > > 
> > > > I retrieve the User records by extent :
> > > > try { 
> > > >         System.out.println("will retrieve users");        
> > > >         Query query = new QueryByCriteria(User.class, 
> null);       
> > > >     
> > > >         // ask the broker to retrieve the Extent collection
> > > >         Collection allUsers = 
> broker.getCollectionByQuery(query);
> > > >         // now iterate over the result to print each product
> > > >         java.util.Iterator iter = allUsers.iterator();
> > > >         while (iter.hasNext())
> > > >         {
> > > >         	System.out.println("User record : ");
> > > >         	User user = (User)iter.next();
> > > >             System.out.println(user.getLoginID());
> > > >             System.out.println(user.getFname());
> > > >             System.out.println(user.getLname());
> > > >             System.out.println(user.getRoleID());
> > > >             System.out.println(user.getEmailAddress());
> > > >             System.out.println((user.getCustomer()).getName());
> > > >             System.out.println("---------------------");
> > > >         }
> > > > 
> > > > As I expect, 1 SQL query to retrieve the User records, and 
> > > 2 queries to
> > > > retrieve the Customer records are generated :
> > > > 50|0|statement|SELECT
> > > > 
> > > A0.emailAddress,A0.fname,A0.customerID,A0.passwordhash,A0.mnam
> > > e,A0.lname,A0.
> > > > roleID,A0.loginID,A0.userID FROM ActiveBillUser A0
> > > > 1050954107641|20|0|statement|SELECT
> > > > 
> > > postalCode,name,country,customerID,addressLine2,status,address
> > > Line1,customer
> > > > Number,dateDeleted,isDeleted,town,customerType FROM 
> Customer WHERE
> > > > customerID = '1' 
> > > > 1050954107651|0|0|statement|SELECT
> > > > 
> > > postalCode,name,country,customerID,addressLine2,status,address
> > > Line1,customer
> > > > Number,dateDeleted,isDeleted,town,customerType FROM 
> Customer WHERE
> > > > customerID = '2' 
> > > > 
> > > > I then insert a User record, with a customerID = 2, which 
> > > should point to
> > > > the "stuff" Customer.
> > > > When I go to retrieve all Users again, using the code 
> > > above. This time, only
> > > > the query to select User records is generated. No queries 
> > > to retrieve
> > > > Customer records are generated. Yet, the customer name is 
> > > printed correctly
> > > > for the first two records. I assume this is because of cacheing?
> > > > 
> > > > However, the third record, the one which had just been 
> > > inserted, throws a
> > > > Null pointer exception when I try to print its Customer 
> > > name. Why? It points
> > > > to the "stuff" customer, which should be in the cache, 
> > > since the second
> > > > record, which just printed successfully, also points to it. 
> > > I clearly do not
> > > > undertstand something about the intersection of cacheing 
> > > and retrieval of
> > > > referenced objects.
> > > > 
> > > > I am using 
> > > > 
> > > 
> ObjectCacheClass=org.apache.ojb.broker.cache.ObjectCachePerBrokerImpl
> > > > if it makes a difference.
> > > > 
> > > > Any insight, or a pointer to something (besides the 
> > > tutorial) which would
> > > > explain
> > > > this behavior?
> > > > 
> > > > Bonnie MacKellar
> > > > software engineer
> > > > Mobius Management Systems, Inc.
> > > > bmackell@mobius.com
> > > > 
> > > > 
> > > > 
> > > 
> > > 
> > > 
> ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
> > > For additional commands, e-mail: ojb-user-help@db.apache.org
> > > 
> > 
> > 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
> For additional commands, e-mail: ojb-user-help@db.apache.org
>