public void releaseSession(); { if (!participate); { if (isSingleSession();); { // single session mode TransactionSynchronizationManager.unbindResource(sessionFactory);; logger.debug("Closing single Hibernate Session in HibernateLazyResolver");; try { closeSession(session, sessionFactory);; } catch (RuntimeException ex); { logger.error("Unexpected exception on closing Hibernate Session", ex);; } } else { // deferred close mode SessionFactoryUtils.processDeferredClose(sessionFactory);; } } } protected Session getSession(SessionFactory sessionFactory); throws DataAccessResourceFailureException { Session session = SessionFactoryUtils.getSession(sessionFactory, true);; // 注意这里与 OpenSessionInViewInterceptor 不同, 需要设置为 auto, 否则会导致以下异常 // org.springframework.dao.InvalidDataAccessApiUsageException: // Write operations are not allowed in read-only mode (FlushMode.NEVER); - // turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition session.setFlushMode(FlushMode.AUTO);; return session; } protected void closeSession(Session session, SessionFactory sessionFactory); { // 需要 flush session session.flush();; SessionFactoryUtils.releaseSession(session, sessionFactory);; } } |
使用方法, 在配置文件中声明
<!-- use to resolve hibernate lazy load --> <bean id="hibernateLazyResolver" class="org.summerfragrance.support.hibernate3.HibernateLazyResolver"> <property name="sessionFactory"><ref local="sessionFactory"/></property> </bean> <bean id="userManager" parent="txProxyTemplate"> <property name="target"> <bean class="org.summerfragrance.security.service.impl.UserManagerImpl" parent="managerTarget"> <property name="userDAO"><ref bean="userDAO"/></property> <property name="hibernateLazyResolver"><ref bean="hibernateLazyResolver"/></property> </bean> </property> </bean> |
然后在代码中这样调用
hibernateLazyResolver.openSession();; ... //需要 lazy load 的代码 hibernateLazyResolver.releaseSession();; |