2009-04-23 8 views
20

NHibernate에서 어떻게 Flush (및 NHibernate.ISession)이 작동하는지 혼란스러워합니다.NHibernate 플러시 - 어떻게 작동합니까?

내 코드에서 ISession.Save(entity)을 사용하여 개체를 저장하면 해당 개체를 데이터베이스에 직접 저장할 수 있습니다.

그러나 ISession.SaveOrUpdate(entity) 또는 ISession.Update(entity)을 사용하여 개체를 업데이트하면 데이터베이스의 개체가 업데이트되지 않습니다. 업데이트하려면 ISession.Flush으로 전화해야합니다.

나는 다음과 같이 객체가 업데이트 방법에 대한 절차 :

  1. 예를 들어, ISession.Get(typeof(T), id)
  2. 변경 객체 속성을 사용하여 데이터베이스에서 개체를 확보, myCar.Color="Green"
  3. 가 다시 그것을 커밋 ISession.Update(myCar)

myCar은 데이터베이스로 업데이트되지 않습니다. 그러나 나중에 ISession.Flush으로 전화하면 업데이트됩니다.

언제 Flush을 사용하고 언제 사용하지 않을까요?

+0

[NHibernate ISession Flush : 가능한 곳과 장소 및 이유] (http://stackoverflow.com/questions/43320/nhibernate-isession-flush-where-and-when-to) -use-it-and-why) – sleske

답변

28

당신은 때 NHibernate에이 플러시 걱정 할 필요가 없습니다.

당신이 자신의 연결을 만들었다면을 만들면된다. 왜냐하면 NHibernate는 커밋 시점을 알지 못하기 때문이다.

정말 중요한 것은 거래입니다. 트랜잭션 중에는 다른 트랜잭션과 분리되어 있습니다. 즉, 데이터베이스 양식을 읽을 때 항상 변경 사항을 볼 수 있으며 다른 트랜잭션은 커밋되지 않은 경우 변경 사항을 볼 수 없습니다. 따라서 당신은 NHibernate가 커밋되지 않는 한 데이터베이스에서 데이터를 업데이트 할 때주의 할 필요가 없다. 어쨌든 누구에게나 보이지 않습니다.당신은 쿼리 전에

  • 를 저지 전화
    • 경우

      NHibernate에 당신이 메모리에 실제 상태를 기준으로 필터링 할 수 있도록 플러시

    • 당신은 플러시

    예를 호출 할 때 :

    using (session = factory.CreateSession()) 
    using (session.BeginTransaction()) 
    { 
        var entity = session.Get<Entity>(2); 
        entity.Name = "new name"; 
    
        // there is no update. NHibernate flushes the changes. 
    
        session.Transaction.Commit(); 
        session.Close(); 
    } 
    

    엔티티는 커밋시 업데이트됩니다. Hibernate는 당신의 세션이 더럽고 데이터베이스에 대한 변경을 플러시하는 것을 본다. 세션 외부에서 변경 한 경우에만 업데이트하고 저장해야합니다. (이는 분리 된 엔티티, 즉 세션에서 알 수없는 엔티티를 의미합니다). 성능에


    주 : 데이터베이스를 업데이트하는 데 필요한 SQL 문을 수행 세척뿐만 아닙니다. 또한 메모리의 변경 사항을 검색합니다. POCO에는 더티 플래그가 없으므로 세션의 모든 객체의 모든 속성을 첫 번째 레벨 캐시와 비교해야합니다. 너무 자주 수행하면 성능 문제가 발생할 수 있습니다.

  • (직렬화가 변화를 확인하기 위해 필요합니다)
  • 사용 read-only entities 때 적절한
  • 직렬화 된 객체를 피

    • 에서 세척하지 마십시오 루프 : 성능 문제를 방지하기 위해 할 수있는 몇 가지가 있습니다 적절한 경우 mutable = false을 설정하십시오.
    • 속성에서 사용자 정의 유형을 사용하는 경우 효율적인 Equals 메소드를 구현하십시오.
    • y가 네가하는 일을 알아.
  • +0

    고마워,하지만 데이터베이스의 개체를 업데이트 할 때 이것은 내 자신의 트랜잭션을 만드는 것을 의미합니까? 아니면 데이터베이스를 업데이트하기 위해 flush를 호출해야하는 이유는 무엇입니까? – Graviton

    +1

    수정해야 함 : 자체 연결을 만들 때 플러시해야합니다. NHibernate는 CreateSession을 호출하면 연결을 생성하지만 사용자 자신의 ADO.NET 연결을 제공 할 수 있습니다. 보통 당신은 이것을 필요로하지 않습니다. 이렇게하지 않으면 flush를 호출 할 필요가 없습니다. –

    6

    NHibernate는 필요할 때만 SQL 문을 수행합니다. 가능한 한 오랫동안 SQL 문의 실행을 연기합니다.

    예를 들어, ID가 할당 된 엔티티를 저장하면 INSERT 문의 실행을 연기 할 수 있습니다. 그러나, 예를 들어 자동 증가 ID를 가진 엔티티를 삽입하면 NHibernate는이 엔티티에 할당 될 ID를 알고 있어야하므로 엔티티를 직접 INSERT해야합니다.

    flush를 명시 적으로 호출하면 NHibernate는 해당 세션에서 변경/생성/삭제 된 객체에 필요한 SQL 문을 실행합니다. 많은 경우에

    Flush

    +0

    제공된 링크가 작동하지 않습니다. '이 콘텐츠는 놀에서 더 이상 볼 수 없습니다.'라고 표시됩니다. – N30

    +0

    @ N30 : 방금 링크를 수정했습니다. –

    관련 문제