in openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DataCacheStoreManager.java [526:660]
public Collection<Object> loadAll(Collection<OpenJPAStateManager> sms, PCState state, int load,
FetchConfiguration fetch, Object edata) {
if (bypass(fetch, load)) {
return super.loadAll(sms, state, load, fetch, edata);
}
Map<OpenJPAStateManager, BitSet> unloaded = null;
List<OpenJPAStateManager> smList = null;
Map<DataCache,List<OpenJPAStateManager>> caches = new HashMap<>();
DataCache cache;
DataCachePCData data;
BitSet fields;
for (OpenJPAStateManager sm : sms) {
cache = _mgr.selectCache(sm);
if (cache == null || sm.isEmbedded()) {
unloaded = addUnloaded(sm, null, unloaded);
continue;
}
if (sm.getManagedInstance() == null
|| load != FORCE_LOAD_NONE
|| sm.getPCState() == PCState.HOLLOW) {
smList = caches.computeIfAbsent(cache, k -> new ArrayList<>());
smList.add(sm);
} else if (!cache.contains(sm.getObjectId()))
unloaded = addUnloaded(sm, null, unloaded);
}
for(Entry<DataCache,List<OpenJPAStateManager>> entry : caches.entrySet()){
cache = entry.getKey();
smList = entry.getValue();
List<Object> oidList = new ArrayList<>(smList.size());
for (OpenJPAStateManager sm : smList) {
oidList.add((OpenJPAId) sm.getObjectId());
}
Map<Object,DataCachePCData> dataMap = cache.getAll(oidList);
for (OpenJPAStateManager sm : smList) {
data = dataMap.get(sm.getObjectId());
CacheStatistics stats = cache.getStatistics();
if (sm.getManagedInstance() == null) {
if (data != null) {
//### the 'data.type' access here probably needs
//### to be addressed for bug 511
if (stats.isEnabled()) {
((CacheStatisticsSPI) stats).newGet(data.getType(), true);
}
sm.initialize(data.getType(), state);
data.load(sm, fetch, edata);
} else {
unloaded = addUnloaded(sm, null, unloaded);
if (stats.isEnabled()) {
((CacheStatisticsSPI)stats).newGet(sm.getMetaData().getDescribedType(), false);
}
}
} else if (load != FORCE_LOAD_NONE
|| sm.getPCState() == PCState.HOLLOW) {
data = cache.get(sm.getObjectId());
if (data != null) {
// load unloaded fields
fields = sm.getUnloaded(fetch);
data.load(sm, fields, fetch, edata);
if (fields.length() > 0){
unloaded = addUnloaded(sm, fields, unloaded);
if (stats.isEnabled()) {
((CacheStatisticsSPI)stats).newGet(data.getType(), false);
}
}else{
if (stats.isEnabled()) {
((CacheStatisticsSPI)stats).newGet(data.getType(), true);
}
}
} else{
unloaded = addUnloaded(sm, null, unloaded);
if (stats.isEnabled()) {
((CacheStatisticsSPI)stats).newGet(sm.getMetaData().getDescribedType(), false);
}
}
}
}
}
if (unloaded == null)
return Collections.emptyList();
// load with delegate
Collection<Object> failed = super.loadAll(unloaded.keySet(), state, load, fetch, edata);
if (!_ctx.getPopulateDataCache())
return failed;
// for each loaded instance, merge loaded state into cached data
boolean isNew;
for(Map.Entry<OpenJPAStateManager, BitSet> entry : unloaded.entrySet()) {
OpenJPAStateManager sm = entry.getKey();
fields = entry.getValue();
cache = _mgr.selectCache(sm);
if (cache == null || sm.isEmbedded() || (failed != null
&& failed.contains(sm.getId())))
continue;
// make sure that we're not trying to cache an old version
cache.writeLock();
try {
data = cache.get(sm.getObjectId());
if (data != null && compareVersion(sm, sm.getVersion(),
data.getVersion()) == VERSION_EARLIER)
continue;
isNew = data == null;
if (isNew)
data = newPCData(sm, cache);
if (fields == null)
data.store(sm);
else
data.store(sm, fields);
if (isNew)
cache.put(data);
else
cache.update(data);
CacheStatistics stats = cache.getStatistics();
if (stats.isEnabled()) {
((CacheStatisticsSPI)stats).newPut(data.getType());
}
} finally {
cache.writeUnlock();
}
}
return failed;
}