2012-11-12 5 views
6

이 질문을 받았지만이 문제를 해결할 수는 없습니다.NHIbernate 컬렉션 새로 고침

컬렉션이있는 nhibernate 개체가 있다고 가정 해 보겠습니다.

문제는 컬렉션의 일부 개체가 다른 사용자에 의해 데이터베이스에서 업데이트 된 경우 (수동으로 데이터베이스 테스트를 목적으로 수정 한 경우), 컬렉션 값을 nhibernate로 새로 고치는 방법을 찾지 못하는 것입니다.

새로 고침 시도, 퇴장,로드 중 ... 세션을 닫고 새 세션을 만드는 것만 가능합니다. 그러나 나는이 해결책이 문제가 있다는 것을 발견하고, 얼마나 힘들지 않다고 말할 수 있는가?

하지만 어쨌든 나는 작동시키지 못합니다. 그렇지 않은 이유를

감사이 실제로 작동 안되는 많은

+0

당신은 부모 나 아이를 축출하고 있습니까? –

+0

yesssssssssssss. 세션 자체에서 기회가있는 경우에만 작동합니다. 다른 방법으로 데이터베이스가 변경된 경우가 아닙니다. –

+0

2 차 캐시를 사용하고 있습니까? – csanchez

답변

1

, 즉이다.

NHibernate는 기본적으로 읽기와 트랙 수정을 최적화하기 위해 세션 레벨 캐시를 사용합니다.

세션이 범위가 지정되어 필요할 때만 사용되어야하므로 데이터 액세스와 관련하여 올바른 작업 단위를 사용하지 않는 것처럼 들립니다.

웹 응용 프로그램의 일부인 경우 "요청 당 세션"접근 방식을 따르는 것이 좋습니다.

실제로이 작업을 원한다면 엔티티를 제거하고 세션에서 가져온 아이를 다시 가져와야하지만 이는 불쾌한 일이며 실제로는 조언하지 않습니다.

+0

나는 헐벗은 것에 동의한다. 그러나 NH는 정말 멋지 며 그 뒤에있는 친구들은 날카 롭고 영리합니다. 나는 이것이 그들이 그것을 의도 한 방법이라고 생각하지 않는다. –

+0

엔티티를 이탈하는 것이 작동하지 않습니다! 그것을 시도했다. 따라서 수집 항목을 하나씩 제거하는 것 외에 다른 선택의 여지가 없습니다. 네가 말했듯이 더러운. 참고로, 데스크톱 응용 프로그램이고 일부 객체는 오래 살 수 있습니다. –

+0

데스크탑 응용 프로그램 인 경우에도 작업 단위 (UOW)를 처리해야합니다. 캐시 된 데이터 인 경우 세션에서 개체 연결을 끊고 다시 업데이트해야합니다. 그렇지 않으면 여러 클라이언트에서 부실 데이터를 기반으로 쓰기 충돌이 발생합니다. – DavidWhitney

0

퇴거를 시도하는 데 어려움을 겪었으며 개회식과 폐회식을 고려했습니다. 필터링 된 get을 수행하는 데 충분한 headspace가있는 것처럼 들리지만, 상위 ID가 상위 객체의 컬렉션 유형의 모든 항목을 가져옵니다. NH와 함께 일하는 방식에 따라 저장소 또는 DAO를 확장해야 할 수도 있지만, 다른 사람들이 말했듯이 예제가 없으면 좀 더 구체화하기 어렵습니다. 요점은 상위 ID로 필터링 된 해당 유형의 쿼리에서 하위 개체를 가져 오는 것입니다.

이것은 새로운 get이 될 것이므로 다른 프로세스에서 만든 새롭거나 변경된 객체를 얻은 다음 해당 컬렉션을 부모 객체의 컬렉션으로 설정할 수 있습니다. 그것이 당신의 물건에 대한 가정을하고 적절하게 저장하거나 갱신 할 수 있기 때문에 NH는 당신이 저축하려고 할 때 이것을 극복해야합니다. 부모 개체를 가져 와서 다시 저장하는 데 시간이 걸릴 가능성이있는 경우이 방법을 사용할 수 있습니다.

이 방식의 문제점은 일종의 병합 유형 작업이 필요하다는 것입니다. 컬렉션이 업데이트 될 때 변경 사항을 잃지 않도록 프로세스에서 생성 된 새 개체를 추가 할 수 있습니다. 이것이 도움이되기를 바랍니다. 아직도 붙어 있다면 더 많은 정보를주세요.

+0

감사! 그러나 상자 콜렉션의 차가운 부분을 걸러진 것으로 바꾸면 NH의 아름다움과 실용성을 잃어 버리는 것 같아요. –

0

SessionFactory 클래스에 IDispose 인터페이스를 구현해야합니다. 다만이 같은

:

public class YouSessionFactory : INHibernateSessionFactory, IDisposable 
{ 
    private ISessionFactory _sessionFactory; 

    //codes for initial _sessionFactory, for configuration,mapping or something else. 
    //balalalalalala 
    //.... 

    public ISessionFactory BuildSessionFactory() 
    { 
     return _sessionFactory; 
    } 

    public void Dispose() 
    { 
     if (!_sessionFactory.IsClosed || _sessionFactory != null) 
     { 
      _sessionFactory.Close(); 
      _sessionFactory.Dispose(); 
     } 
    } 
} 
관련 문제