Answering my own question from my experimenting.

The reason there was little to no caching was because there were no hard references to the objects so they would fall out of the cache quicklyr. Now that I think about it it makes perfect sense, the eo cache would have to be using something like soft references. So I believe in this case an instance variable is called for.

-- Jonathan

On Oct 15, 2008, at 3:17 PM, Jonathan Ricker wrote:

Hey All,

Heres my basic scenario. Ive got an entity called a CARule entity. For some of these rules the value attribute contains a department number which should equal the primary key value of a related entity called CADept (which is read-only entity). So I created this method in the CARule.java class to get the CADept related object (if there is one). It works fine, but the problem is that the value is not cached.. I log out the sql and it is fetching nearly every time for the same editing context. What am I missing? I thought it would essentially fetch once and be cached thereafter. It is all in a standard ERXEC editing context without any special settings.

        /**
         * A method to get the CADept object related to this rule.  It will
         * return null unless it is the appropriate type of role
         */
        public CADept dept(){
                CADept dept = null;
                if (isDeptLeafRule()){
                        EOGlobalID gid = EOKeyGlobalID.globalIDWithEntityName(
                                        CADept.ENTITY_NAME, new 
String[]{value()});
System.out.println("Fetching " + value() + " in ec " + editingContext());
                        dept = (CADept)editingContext().objectForGlobalID(gid);

                        if ( dept == null){
//dept = (CADept)ERXEOGlobalIDUtilities.fetchObjectWithGlobalID (editingContext(), gid); // I tried the above as well and still didn't get the caching I wanted. dept = (CADept)editingContext().faultForGlobalID(gid, editingContext()); // Could be a bad rule if the value does not equal to a know dept number
                                // trigger the fault here and catch it.
                                try{
System.out.println("Triggering "+value()+" in ec: " + editingContext());
                                        dept.deptName();
                                }catch (ObjectNotAvailableException e){
                                        log.error("Rule has dept value of " + 
value()
                                                        + " which is not in 
common_dept!", e);
                                        dept = null;
                                }
                        }else{
                                System.out.println("Got the dept " + value() + " 
directly");
                        }

                }
                return dept;
        }



Thanks in advance for any help on this (particularly on my understanding of caching, I know I can do some workarounds to make the app more efficient but I'm trying to avoid my tendency to do that here)

-- Jonathan


 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/webobjects-dev/jricker%40vt.edu

This email sent to [EMAIL PROTECTED]

 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to [EMAIL PROTECTED]

Reply via email to