Below is a proposal that could possibly be included in a JDO2.2 (or in JDO2.1
if feedback is positive for that, and JPOX already implements it).
========================================
Problem : fetch groups are static, defined in metadata (XML/annotations).
Sometimes it would be more convenient to be able to define fetch groups
dynamically, for example based on user interaction in a web system.
========================================
Proposal :
We add a new interface defining a FetchGroup, where a FetchGroup has a
symbolic name and is for a class defining the fields of that class that are
in the fetch group.
public interface FetchGroup
{
String getName(); // Symbolic name (as also used in MetaData)
String getClassName(); // Class to which this group refers
FetchGroup add(String fieldName); // Add a field
FetchGroup remove(String fieldName); // Remove a field
boolean hasField(String fieldName);
String[] getFieldNames();
void setPostLoad(boolean postLoad);
boolean getPostLoad();
}
We allow users to register/deregister their FetchGroups with the PMF
PersistenceManagerFactory
{
...
void addFetchGroup(FetchGroup grp);
void removeFetchGroup(String name, Class cls);
FetchGroup createFetchGroup(String name, Class cls);
FetchGroup getFetchGroup(String grpName, Class cls);
FetchGroup[] getFetchGroups();
void clearFetchGroups();
}
========================================
Usage:
FetchGroup grp1 = pmf.createFetchGroup("myGroup1", MyClass.class);
grp1.add("field1").add("field2").add("field4");
pmf.addFetchGroup(grp1); // FetchGroup registered
pm.getFetchPlan().setGroup("myGroup1"); // FetchGroup used in this plan
// FetchPlan now has MyClass {field1, field2, field4}
We can then also allow dynamic changes like
pmf.getFetchGroup("myGroup1", MyClass.class).add("field7");
and this is directly reflected in the FetchPlan
Possible changes:-
1. PMF has createFetchGroup and addFetchGroup and we could merge these so when
creating a FetchGroup it is added
2. Doesnt support "recursion-depth" specification when adding a field to a
FetchGroup, so we could add a method "add(String fieldName, int depth)"
--
Andy (Java Persistent Objects - http://www.jpox.org)