2010-12-22 4 views
4

열린 세션 중에 관련 객체를 게을리로드 할 수 있지만 세션이 닫힌 후에도 관련 객체를 사용할 수 있습니까?Hibernate Lazy Loading - 세션이 닫힌 후

예를 들어 USER 클래스와 관련 ROLE 클래스가 있습니다. USER를로드 할 때 관련 ROLE 객체를 게으르게로드합니다. 세션이 닫힌 후에 USER 클래스와 ROLE 클래스를 완전히로드하고 사용할 수 있습니까?

이 기능을 사용할 수 있습니까?

답변

8

짧은 대답 : 아니오. 세션이 닫히기 전에 세션을 닫기 전에 필요한 모든 것을 초기화해야합니다. (열거하지 않고) 게으른 프록시로드를 강제하는 데 사용하는 방법은 NHibernateUtil.Initialize(USER.ROLES)입니다.

긴 대답은 ... 종류의. PersistentBags와 다른 NH 프록시를 초기화 할 수 있도록 새로운 세션에 객체를 "재 부착"하는 것이 가능합니다. 개체가 DB에 있지만 새 세션에는 존재하지 않으며 아직 수정하지 않았다는 것을 알면 사용하는 가장 좋은 방법은 Session.Lock(USER, LockMode.None)입니다. 이것은 Hibernate에게 객체의 읽기 또는 쓰기와 관련하여 아무 것도하지 말라고하지 않고 객체를 새로운 세션과 연관시킵니다.

그러나이 코드 냄새가 나는 것이 좋습니다. 정기적으로 개체를 새 세션에 다시 연결하는 경우 세션을 오래 열려 있지 않다는 신호입니다. 예를 들어, 윈도우 폼 당 하나의 세션을 열고, 폼이 열려있는 한 그것을 열어두면 문제가 없습니다. 창이 닫히면 닫을 수 있습니다.

0

1-1 관계 (사용자 당 0-1 역할)를 처리하는 경우 가장 간단한 옵션은 지연로드가 아닌 eager 페치에 맞게 구성하는 것입니다. 게으른 적재는 실제로 1- * 친척, 또는 특히 크고 거의 필요없는 대상을 대상으로합니다. NH는 이와 같은 시나리오에서 열심히 빠른 데이터를 포함하도록 쿼리를 최적화하는 작업을 훌륭하게 수행합니다.

0

예. 세션이 닫히면 지연로드 된 모든 개체는 메모리에 남아 있으므로 문제없이 액세스 할 수 있습니다.

관련 문제