You might also consider overloaded methods on interface FetchGroup,
just for completeness:
// (importing java.lang.reflect.Field)
FetchGroup add(Field field);
FetchGroup remove(Field field);
boolean hasField(Field field); // or has(Field) -- I'd consider
better verb
Field[] getFields();
The add & remove methods should throw if the Field isn't contained in
the class.
-matthew
On Nov 13, 2007, at 2:32 AM, Andy Jefferson wrote:
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)