我不認爲Hibernate支持這一點。 'n + 1選擇問題'是一個衆所周知的問題,Hibernate有很多處理它的策略(批處理,子查詢,提取等)。問題是你有'n + 1網絡服務調用',所有這些機制都沒用。 Hibernate根本不知道你在IUserType中做什麼。它假定你轉換已經加載的數據。
它看起來像你將不得不實施自己的預加載。類似這樣的:
// TODO: not thread safe, lock or use ConcurrentDictionary
static IDictionary<Int32, ClientDto> _preLoadedClients
= new IDictionary<int,ClientDto>();
public Object NullSafeGet(IDataReader rs, String[] names, ...) {
Int32 clientid = NHibernateUtil.Int32.NullSafeGet(rs, names[0]);
// see if client has already been preloaded:
if(_preLoadedClients.ContainsKey(clientid)) {
return _preLoadedClients[clientid];
}
// load a batch: clientId + 1, client + 2, ... client + 100
var batchOfIds = Enumerable.Range(clientid, 100);
var clientsBatch = clientService.GetClientsByIds(batchOfIds);
_preLoadedClients.Add(clientsBatch);
return _preLoadedClients[clientid];
}