2010-04-05 5 views
1

를 사용하여 삽입 후 즉시 조회 할 때 나는이 MySQL을 내 테이블에 대해 다음 매핑 : 잘못된 구성 요소 NHibernate에

<class name="Tag, namespace" table="tags" > 
<id name="id" type="Int32" unsaved-value="0"> 
    <generator class="native"></generator> 
</id> 
<property name="name" type="String" not-null="true"></property> 
<component name="record_dates" class="DateMetaData, namespace" > 
    <property name="created_at" type="DateTime" not-null="true"></property> 
    <property name="updated_at" type="DateTime" not-null="true"></property> 
</component> 
</class> 

당신이 record_dates 속성 타입 DateMetaDate의 구성 요소 필드로 정의된다시피

. 'tags'테이블의 created_at 및 updated_at 필드는 모두 트리거를 통해 업데이트됩니다. 따라서 나는 그런처럼 새 레코드를 삽입 할 수 있습니다 그러나

var newTag = new Tag() 
{ 
name = "some string here" 
} 

Int32 id = (Int32)Session.Save(tag); 
Session.Flush(); 

ITag t = Session.Get<Tag>(id); 
ViewData["xxx"] = t.name; // -----> not null 
ViewData["xxx"] = t.record_dates.created_at; // -----> is null 

을 다시 바로이 record_dates 필드를 삽입 한 후 동일한 레코드를 조회 테이블에서 해당 필드 값을 가지고있다하더라도 null의 끝 때.

Session.Get이 테이블에서 모든 것을 다시 가져 오는 것을 무시하는 이유는 무엇입니까? 그것은 records_dates가 null 인 새로 작성된 레코드를 캐시하기 때문입니까? 그렇다면 어떻게 캐시 된 버전을 무시하라고 할 수 있습니까? 사용

답변

0

시도 게으른 = 클래스 태그에 "거짓"

내 지식으로 당
<class name="Tag, namespace" table="tags" lazy="false"> 

, 기본 동작은 필요에 따라 개체를 새로 표시되지 않을 수도 있습니다 게으른 로딩을하는 것입니다.

+0

제안 해 주셔서 감사합니다. 나는 그것을 시험해 보았고 행운이 없었다. 참고로'hbn.xml '파일의 변경 사항이 반영되도록 DTO 프로젝트를 다시 작성했습니다. – Roman

+0

가져 오기 대신로드를 사용해 볼 수도 있습니다. 로드가 당신이 필요로하는 것의 반대를하기 때문에 그것이 도움이 될 것이라고 나는별로 희망이 없지만. 그러나 어쨌든 시도 할 수 있습니다. 로드와 가져 오기의 차이점에 대한 자세한 내용은이 링크를 참조하십시오. http://ayende.com/Blog/archive/2009/04/30/nhibernate-ndash-the-difference-between-get-load-and-querying-by.aspx – Prashant

0

지금까지 단 한 번도 NHibernate 세션 객체에 대해 Session.Clear() 메소드를 호출하는 것으로 밝혀졌습니다.이 객체는 NHibernate가 테이블에서 레코드를 다시 가져 오도록 강제합니다. 그러나 캐시에있는 모든 것을 제거하므로 비효율적입니다.

0

ISession.Refresh(obj)을 호출하여 개체를 데이터베이스에서 강제로 다시로드 할 수 있습니다. 제 이해는 모든 관계를 새로 고치지 않으므로 전체 개체 그래프를 다시로드해야하는 경우 ISession.Evict(obj)을 호출 한 다음 ISession.Get(id)을 호출하여 캐시에서 제거하고 다시로드하십시오.