@SuppressWarnings("unchecked")
	private void collectPreloadEntities(
			final Map<PreloadAccessor, Collection<Object>> bulkPreloadMap,
			final Set<Object> visited, final Object entity,
			final PreloadAccessor[] preloads,
			final Map<Object, Object> alreadyLoadedEntities) {
		if (entity == null || preloads == null) {
			return;
		}

		if (visited.contains(entity)) {
			return;
		}
		visited.add(entity);

		if (entity instanceof Collection) {

			for (Object resultEntity : (Collection) entity) {
				collectPreloadEntities(bulkPreloadMap, visited, resultEntity,
						preloads, alreadyLoadedEntities);
			}

		} else {

			// if (entity instanceof IdentifiedObject) {
			// // todo Jetzt werden die Entities auch korrekt beim Preloading
			// // gesetzt
			// // falls irgend ein anderes (prezuloadendes) Proxy-Entity darauf
			// // "stößt"... Funktioniert leider nur für
			// // IdentifiedObject-Entities -
			// // andere Möglichkeit wäre (analog) zu den Proxy-Obj.
			// // "id-getter-Funktionsname" zu übergeben :-(
			// IdentifiedObject rpo = (IdentifiedObject) entity;
			// alreadyLoadedEntities.put(rpo.getId(), rpo);
			// }
			String idProperty = serviceProvider
					.getIdPropertyForEntityClass(entity.getClass());
			if (idProperty != null) {

				alreadyLoadedEntities.put(PreloadAccessor
						.getPropertyFromEntity(entity, idProperty), entity);
			}

			// crucial part: Search for preloads matching entity's class and
			// build up a map
			// preload -> matching entities in order to do a bulk preload later
			// on
			for (PreloadAccessor preload : preloads) {
				if (preload.getEntityClass().isInstance(entity)) {
					add2BulkPreloadEntityMap(bulkPreloadMap, preload, entity);
				}
			}

		}
	}