What do you think of the following? More for discussion than a proposal just
yet.
Section 12.7.6 states "Fetch groups are only defined in the metadata for a
class or interface." It might be convenient for users or tools to be able to
dynamically modify the FetchPlan or define fetch groups, possibly based on a
runtime analysis of usage. Another possible use would be to allow aspects to
be applied to service-level components to dynamically modify the FetchPlan or
define fetch groups.
Add a new interface FetchGroup:
public interface FetchGroup {
String getName();
boolean getPostLoad();
Map<String,Integer> getFieldRecursionDepths(); // key is field expression,
value is recursion depth
Map<String,Integer> getPropertyRecursionDepths(); // key is property
expression, value is recursion depth
// Add mutators also? See possible method additions to FetchPlan or
PersistenceManager interface below
void setName(String name);
void setPostLoad(boolean postLoad);
void add{Field|Property}(Class clazz, String {field|property}Expression[, int
recursionDepth]);
void add{Fields|Properties}(Class clazz, Map<String,Integer>
{field|property}RecursionDepths);
}
Possible method additions to the FetchPlan or PersistenceManager interface:
FetchGroup newFetchGroup(); // creates an empty fetch group if mutating methods
allowed on FetchGroup
FetchGroup newFetchGroup(Map<String,Integer> fieldRecursionDepths,
Map<String,Integer> propertyRecursionDepths, String name, boolean postLoad);
// plus various convenience methods based on above
Possible method additions to FetchPlan interface, all of which add anonymous
fetch groups to the FetchPlan on which they're called:
FetchPlan addField(Class clazz, String fieldExpression); // defaults
recursionDepth to 1
FetchPlan addField(Class clazz, String fieldExpression, int recursionDepth);
FetchPlan addFields(Class clazz, Map<String,Integer> fieldRecursionDepths);
FetchPlan addProperty(Class clazz, String propertyExpression); // defaults
recursionDepth to 1
FetchPlan addProperty(Class clazz, String propertyExpression, int
recursionDepth);
FetchPlan addProperties(Class clazz, Map<String,Integer>
propertyRecursionDepths);
FetchPlan addFetchGroups(FetchGroup... fetchGroups);
FetchPlan addClasses(Class... classes); // convenience method that
would add all fields/properties of the given class at a recursion depth
of 0 or 1 (TBD)
// include * remove*(..) methods?
Collection<FetchGroup> getFetchGroups();