Ok, I coded a way to recurse through the object graph using Hibernate Metadata, but the strange thing is that I have the undesired effect of hydrating *all* the lazy objects, when all I want is the ones I pass in, called "inflatables."  Does anyone know why this would be occuring?
Code:
    public void lazyInflateDeep(final SessionFactory sesFactory, Object object,
            Set inflatables) throws DaoException {
        try {
            Class objClass = object.getClass();
            ClassMetadata classMetadata = sesFactory.getClassMetadata(objClass);
            if (classMetadata == null) {
                // If here, then we are dealing with a CBLIB Proxy class and
                // must use the ProxyHelper to get the proxied class
                objClass = HibernateProxyHelper.getClass(object);
                classMetadata = sesFactory.getClassMetadata(objClass);
            }
            // get persistent properties
            Type[] propertyTypes = classMetadata.getPropertyTypes();
            String[] propertyNames = classMetadata.getPropertyNames();
            // for each persistent property of the bean
            for (int i = 0; i < propertyTypes.length; i++) {
                if (propertyTypes[i].isPersistentCollectionType()) {
                    CollectionMetadata collectionMetadata = sesFactory
                            .getCollectionMetadata(((PersistentCollectionType) propertyTypes[i])
                                    .getRole());
                    String propName = propertyNames[i];
                    Collection collection = (Collection) classMetadata
                            .getPropertyValue(object, propName);
                    if (collection != null && !collection.isEmpty()) {
                        if (collectionMetadata.isLazy()
                                && !Hibernate.isInitialized(collection)) {
                            if (inflatables.contains(propName)) {
                               Hibernate.initialize(collection);
                               log.info("Inflating: " + propName);
                            }
                        }
                        recurseAndInflateGraph(sesFactory, collection, inflatables);
                    }
                } else if (propertyTypes[i].isAssociationType()) {
                    String propName = propertyNames[i];
                    Object association = classMetadata
                            .getPropertyValue(object, propName);
                    if (association != null ) {
                        if (!Hibernate.isInitialized(association)) {
                            if (inflatables.contains(propName)) {
                               Hibernate.initialize(association);
                              log.info("Inflating: " + propName);
                           }
                        }
                    }
                }
            }
        } catch (HibernateException he) {
            log.warning("Hibernate Exception thrown: " + he);
            throw new DaoException(he);
        }
    }
    private void recurseAndInflateGraph(final SessionFactory sesFactory,
            final Collection collection, final Set inflatables) throws DaoException {
        for (Iterator iter = collection.iterator(); iter.hasNext();) {
            Object o = iter.next();
            lazyInflateDeep(sesFactory, o, inflatables);
        }
    }