Je ne pense pas que Hibernate supporte cela. 'n + 1 select problem' est un problème bien connu et Hibernate a quelques stratégies pour y faire face (lots, sous-sélections, chargement exaltant, etc.). Le problème est que vous avez un 'appel de service Web n + 1' et tous ces mécanismes sont inutiles. Hibernate ne sait tout simplement pas ce que vous faites dans IUserType. Il suppose que vous convertissez des données déjà chargées.
Il semblerait que vous deviez implémenter votre propre préchargement. Quelque chose comme ceci:
// 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];
}