<< 2008년 7월 11일 (금) | | 2008년 7월 13일 (일) >>

OpenSessionInViewInterceptor 와 OpenSessionInViewFilter 예제

Spring Framework와 Hibernate를 연동해서 사용할 때는 many-to-one or one-to-one 관계에서 View단을 위해서 비즈니스 오브젝트를 렌더링하고자 lazy property와 함께 비즈니스 오브젝트를 위한 객체를 접근하게 되는데 이때 LazyInitializationException을 발생하는 경우가 생깁니다.
즉, 한 세션을 실행하다가 롤백을 하면 하이버네이트 트랜잭션 매니저가 현재 열려있는 세션을 바로 닫아버려 예외가 발생합니다.

그래서 Hibernate의 Lazy Loading을 사용하려면 꼭 OpenSessionInViewFilter나 OpenSessionInViewInterceptor를 적용해줘야 합니다.
그럼 OpenSessionInViewFilter와 OpenSessionInViewInterceptor중 무엇을 사용해야할 지 그 판단 기준은 무엇일까요?
하나는 fileter이고 하나는 interceptor인가요? ^^

Servlet Container가 2.3이거나 그 이후를 지원한다면 둘중에 아무거나 사용하셔도 되구요. 만약에 Servlet Container 2.2이후의 버전이라면 OpenSessionInViewInterceptor의 사용을 권장합니다.

1. OpenSessionInViewInterceptor

 - xxx-servlet.xml
<bean id="urlMapping"  
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
<list><ref bean="openSessionInViewInterceptor"/></list>
</property>
<property name="mappings">
</bean>
<bean name="openSessionInViewInterceptor"
class="org.springframework.orm.hibernate3.support.
OpenSessionInViewInterceptor">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>

2. OpenSessionInViewFilter
 - web.xml
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sessionFactory</param-value>
</init-param>
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.html</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>