使用来自webservice的值预加载IUserType

时间:2011-09-06 16:06:27

标签: web-services hibernate nhibernate iusertype

这篇文章:

http://kennytordeur.blogspot.com/2011/04/nhibernate-in-combination-with_06.html

描述如何从数据库以外的资源加载实体,在本例中为webservice。这很好,但如果我在一个查询中加载了许多客户端,每个客户端都有不同的MaritialState,则必须为每个客户端调用webservice。有没有办法预加载所有婚姻状态,所以它不必为每个客户端回传到网络服务?

1 个答案:

答案 0 :(得分:1)

我不认为Hibernate支持这一点。 'n + 1选择问题'是一个众所周知的问题,Hibernate有很多处理它的策略(批量,子选择,急切提取等)。问题是你有'n + 1个Web服务调用',所有这些机制都没用。 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];
}