2010-07-19 4 views
0

엔티티를 검색 한 후에 속성을 변경합니다. 그런 다음 동일한 항목을 검색합니다.NHibernate FlushMode : 엔티티를 자동으로 업데이트하기 위해 NHibernate를 설정하는 방법

Nhibernate는 엔티티를로드하기 전에 엔티티를 업데이트해야한다고 어떻게 말합니까? 여기

코드 :

EmployeeRepository employeeRepository = new EmployeeRepository(); 
Employee employee = employeeRepository.GetById(4); 
employee.LastName = "TEST!!!"; 
Employee employee2 = employeeRepository.GetById(4); 

현재 NHibernate에 내 프로그램 업데이 트를하지 않습니다. FlushMode를 Auto로 설정하면 엔티티가 자동으로 업데이트됩니다.

편집 배경은 다른 응용 프로그램에서이 동작을 reprdouce하려고합니다. 저장 방법이 없습니다! 이 코드 만. NHibernate 버전은 정말 오래된 버전 1.2.1.4000입니다. 어쩌면 잡을 수 있습니다.

Brownfield 응용 프로그램에서 FlushMode를 Commit으로 설정하면 업데이트 문이 생성되지 않습니다.

그러나 내 자신의 프로젝트에서 나는 여전히이 "자동"동작을 재현 할 수 없습니다.

답변

3

궁극적으로 동일한 NHibernate ISession 인스턴스를 사용하여 employeeRepository를 호출합니까? 그렇다면 동일한 객체를 반환하고 업데이트 된 LastName 값이 반영됩니다. 그렇지 않은 경우 자동 플러싱을 활용할 때마다 매번 ISession 인스턴스를 처분해야합니다. 자동차의 기본 FlushMode에 대한 the documentation에 따르면

+0

내 편집 – Rookian

+0

을 보시기 바랍니다. 자동으로 FlushMode를 설정했기 때문에 같은 "ISeesions"를 사용할 때 NHibernate가 자동으로 업데이트 SQL 문을 호출합니까? – Rookian

+0

아니요, 변경된 개체를 메모리에 캐시합니다. –

1

는 :

ISession 쿼리가 오래된 상태를 반환하지 않도록 하기 위해 쿼리 실행 전에 를 플러시 종종있다. 이것은 기본 비우기 모드입니다.

따라서 개체를 다시 읽기 전에 변경 내용이 유지되도록 세션을 수동으로 플러시해야합니다.

EmployeeRepository employeeRepository = new EmployeeRepository(); 
Employee employee = employeeRepository.GetById(4); 
employee.LastName = "TEST!!!"; 
session.Flush(); 
Employee employee2 = employeeRepository.GetById(4); 

(이 IMO한다로) 다음 직원 4 캐시에서 검색하고 변경이됩니다 저장소가 모두 통화에 대해 같은 ISession를 사용하는 경우. 그러나 변경 내용은 아직 데이터베이스에 보관되지 않았습니다.

리포지토리 GetById 메서드가 각 호출에 대해 새 세션을 사용하는 경우 항상 데이터베이스를 방문하여 직원을 검색합니다. 메서드에서 세션을 폐기하는 경우 객체는 세션에서 분리 된 것으로 반환됩니다. 이 전략은 NHibernate의 목적을 무효화하고 단순한 데이터 접근 도구로 이관한다.

+0

"때때로 ISession이 플러시됩니다."때때로 의미하는 것 : D? 글쎄, Nhibernate가 SQL 문을 호출 할 때? 나는 이것을 정확하게 이해하지 못했습니다. – Rookian

+0

나는 확실하지 않습니다. 내 기대는 당신이 직원을 검색하고 변경 한 다음 테이블에서 select를 한 경우 NHibernate는 세션이 먼저 플러시되어 질의가 일관된 결과를 리턴 할 것이라는 것이다. 동일한 세션에서 작업이 완료된 경우에만 작동합니다. 기본 키로 개체를 가져 오는 것은 다른 이야기입니다. 이 경우에 Hibernate는 캐시로부터 그것을 검색 할 것이다. –

+0

이제 GetByName 메서드를 구현하여 ICriteria API를 통해 엔터티를 검색했지만 아직 업데이트 문이 없습니다. FlushMode = auto 같은 세션이 있습니다. 내가 틀린 게 뭐야? – Rookian

관련 문제