2012-02-09 4 views
3

NHibernate 세션에서 연결이 끊긴 프록시가 있는데 두 번째 세션에서 수정되었는지 확인하려고합니다. 이 과정에서, 나는 개체가 프록시인지 확인하고,이 경우, 다음의 호출을 수행IPersistenceContext.UnproxyAndReassociate 후에 IPersistenceContext.GetEntry가 null을 반환하는 이유는 무엇입니까?

var proxy = entity as INHibernateProxy; 
var obj = persistenceContext.UnproxyAndReassociate(proxy); 
var oldEntry = persistenceContext.GetEntry(obj); 

내가 oldEntry가 null되지 않을 것이라는 점을이 시점에서 기대 프록시 이후 및 기본 엔티티가 persistenceContext과 다시 연결되었습니다. 그러나 UnproxyAndReassociateStatefulPersistenceContext.entityEntries 맵을 엔터티로 채우지 않습니다.

왜 안 되니? 리 어소시에이션이로드와 동일한 것으로 간주되지 않습니까? 당신이 UnproxyAndReassociate의 구현을 살펴 경우

답변

0

:

public object UnproxyAndReassociate(object maybeProxy) 
{ 
    var proxy = maybeProxy as INHibernateProxy; 
    if (proxy != null) 
    { 
     ILazyInitializer li = proxy.HibernateLazyInitializer; 
     ReassociateProxy(li, proxy); 
     return li.GetImplementation(); //initialize + unwrap the object 
    } 
    return maybeProxy; 
} 

프록시를 재접속이 보인다 그리고 당신은 다시 unproxied 개체를 얻을. ReassociateProxy을 수행합니다

private void ReassociateProxy(ILazyInitializer li, INHibernateProxy proxy) 
{ 
    if (li.Session != Session) 
    { 
     IEntityPersister persister = session.Factory.GetEntityPersister(li.EntityName); 
     EntityKey key = new EntityKey(li.Identifier, persister, session.EntityMode); 
     // any earlier proxy takes precedence 
     if (!proxiesByKey.ContainsKey(key)) 
     { 
      proxiesByKey[key] = proxy; 
     } 
     proxy.HibernateLazyInitializer.Session = Session; 
    } 
} 

그래서 그것은 사전 proxiesByKey에 저장됩니다.
public EntityEntry GetEntry(object entity) 
{ 
    return (EntityEntry)entityEntries[entity]; 
} 

GetEntry

은 심지어 프록시를 reassociating하는 세션과 기본 항목을 reassociating와 동일하지 않으며, proxiesByKey을 고려하지 않습니다.

관련 문제