2009-04-20 4 views
6

오랜 시간이 걸렸지 만 마침내 nHibernate의 Hello World가 작동했습니다. 내가 "게으른 로딩"을 한 후에 작동했습니다. 솔직히 말해서 왜 모든 것이 효과가 있었는지 말할 수는 없었지만, 이제는 게으른 로딩이 필요 없다는 것을 읽고 있습니다. 누구나 가지고있는 뼈가 nHibernate 작업을하는 안녕하세요 세상이 있습니까? 게으른로드가 필요합니까? nHibernate를 사용하고 싶기 때문에 물어 본다.하지만 어떻게 작동하는지 이해해야한다.nHibernate에 대한 지연로드가 필요합니까?

감사합니다.

너무 많은 오버 헤드가없는 세상을 알고 계십니까?

게으른로드를 사용하는 것이 더 좋습니까?

편집 : asp.net 3.5를 사용하고 있습니다. 웹 응용 프로그램 프로젝트.

+0

대답은 다른 섹션을 추가했습니다. –

답변

22

난 당신이 "나는 게으른 로딩을했다"로 무슨 뜻인지 이해하지를 생성하는 모든 침을 것입니다. 지연로드는 기능이며 기본적으로 사용하도록 설정되어 있으며 마음에 들지 않으면 끌 수 있습니다.

다른 엔티티에 대한 참조 및 목록에 대한 두 가지 종류의 지연로드가 있습니다. 이 엔티티 감안할 때

: 사용자

에 대한 참조에

class Entity 
{ 
    // pk 
    int id { get; private set; } 

    // reference to another entity 
    User MyUser { get; set; } 

    // list to other entities 
    IList<Comments> MyComments { get; set; } 
} 

게으른 로딩이 사용자에 게으른 로딩이있는 경우, 당신은 가상 사용자 클래스의 모든 구성원을 정의 할 필요가있다. Hibernate는 프록시 라 불리는 것을 생성 할 것이다. 프록시는 런타임시 사용자가 파생 된 클래스로 정의됩니다. 귀하의 코드는 User로 액세스하고 있으며 서브 클래스임을 인식하지 못합니다. 그러나 처음 멤버에 액세스 할 때 속성은 데이터베이스에서로드됩니다.

당신이 사용자 클래스에 게으른 로딩을 해제 할 경우

, 당신은 매핑에서이 작업을 수행 할 필요가 :

<class name="User" lazy="false"> ... 

그런 다음 NHibernate에 항상 형 사용자, 아니 프록시의 인스턴스를 생성합니다. 가상의 것을 가질 필요는 없습니다. 의견

당신은 코멘트 목록에 게으른 로딩을 사용하는 경우 목록에

게으른 로딩, 그것은 게으른 로딩을 구현하는 목록 자체입니다. 처음으로 목록에 액세스하면 데이터베이스에서로드됩니다. Hibernate는 IList를 구현하는리스트를 사용하지만, List는 아니다.이 목록에 게으른 로딩을 해제 할 경우

, 당신은 엔티티의 매핑에서이 작업을 수행 :

<class name="Entity"> 
    <bag name="MyComments" lazy="false" > 
     ... 

보통 게으른 로딩이 좋은 일이, 그리고 응용 프로그램이 걱정 할 필요가 없습니다 그것 많이. 그러나 몇 가지 위험이 있습니다. 예를 들어, 인스턴스를 직렬화하고 프록시 인 경우 유용하지 않은 초기화 된 프록시가 없습니다. 지연로드는 세션이 열려있는 동안에 만 작동합니다. 지연로드를 사용하는 것이 항상 더 빠를 수는 없습니다. 당신은 모든 데이터를 어쨌든로드 해야하는 경우, 한 조각으로로드하는 것이 더 빠릅니다.

따라서 구성을 신중하게 수행해야합니다.


편집 :

원래의 질문에 대답하려면 : 게으른 로딩이 NHibernate에 필요합니까? 아니요. 그러나 : 응용 프로그램에 지연로드가 필요합니까? 아마 그렇 겠지.

저는 작고 오히려 간단한 응용 프로그램만으로는 지연로드가 필요하지 않다고 생각합니다. 많은 영속 클래스를 가진 시스템을 가지고 있다면, 느슨한 로딩이 필요할 것이다.

+0

NH 참조 문서는 게으른 초기화가 버그 [...]로 이어질 수 있기 때문에 non-laziness가 기본값입니다. "그리고''NHibernate는 콜렉션을위한 lazy select 페칭과 싱글 - "- 컬렉션을 위해서 –

+0

@Chris : 첫 번째 문장은 오래되었습니다. Lazy는 버전 (i-dont-know) 이후 기본값입니다. 두 번째 문장은 내가 실제로 설명하려고했던 것입니다. –

7

매핑을 위해 hbm.xml 파일을 사용하는 경우 <class> 요소에 lazy="false"을 추가하기 만하면 모든 간단한 속성에 대해 게으른로드가 발생하지 않습니다. 외국 엔티티는 기본적으로 여전히 게으르다. 그들을 열렬하게 만들려면 lazy="false"을 매핑 요소에 추가하십시오. 열망하는로드의 한 가지 이점은 더 이상 엔티티 클래스에서 가상 속성을 필요로하지 않는다는 것입니다.

편집 : 백그라운드에서 무슨 일이 일어나고 있는지 정말로 알고 싶다면 NHibernate는 log4net을 사용하여 모든 것을 기록합니다. 당신의 Web.config에 <configuration> 내부

<configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 
    <!-- Rest of config sections here --> 
</configSections> 
<log4net> 
    <appender name="SQLFileAppender" type="log4net.Appender.RollingFileAppender, log4net"> 
    <param name="File" value="C:\Logs\SQL.log" /> 
    <param name="AppendToFile" value="true" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <param name="ConversionPattern" value="%date [%thread] %-5level %logger - %message%newline" /> 
    </layout> 
    </appender> 
    <logger name="NHibernate.SQL" additivity="false"> 
    <level value="DEBUG" /> 
    <appender-ref ref="SQLFileAppender" /> 
    </logger> 
</log4net> 

를 추가하면 SQL NHibernate에 파일 c:\logs\sql.log

관련 문제