`
5xnl
  • 浏览: 24151 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

非web环境spring管理hibernate,延迟加载问题

阅读更多
/*
 * @(#)HibernateLazyResolver.java
 *
 * Copyright 2009 Xinhua Online, Inc. All rights reserved.
 */

package com.winxuan.framework.util.hibernate;

import java.io.Serializable;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.FlushMode;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.orm.hibernate3.SessionFactoryUtils;
import org.springframework.orm.hibernate3.SessionHolder;
import org.springframework.transaction.support.TransactionSynchronizationManager;

/**
 * 仿照openSessionInViewFilter,完成在非web环境下session打开
 * @version 1.0,2009-6-9
 */


public class HibernateLazyResolver implements Serializable{

	private static final long serialVersionUID = 4728620183698481396L;

	private static final Log LOG = LogFactory.getLog(HibernateLazyResolver.class);;

	private boolean singleSession = true; 

	private SessionFactory sessionFactory;

	boolean participate = false;

	protected Session session = null;
	   
	public final void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory=sessionFactory;
	}

	/**
	* Set whether to use a single session for each request. Default is true.
	* <p>If set to false, each data access operation or transaction will use
	* its own session (like without Open Session in View);. Each of those
	* sessions will be registered for deferred close, though, actually
	* processed at request completion.
	* @see SessionFactoryUtils#initDeferredClose
	* @see SessionFactoryUtils#processDeferredClose
	*/
	public void setSingleSession(boolean singleSession) {
		this.singleSession = singleSession;
	}

	/**
	* Return whether to use a single session for each request.
	*/
	protected boolean isSingleSession() {
		return singleSession;
	}

	/**
	 * 初始化 session, 在需要 lazy 的开始处调用
	 *
	 */
	public void openSession() {
		if (isSingleSession()) {
			// single session mode
			if (TransactionSynchronizationManager.hasResource(sessionFactory)) {
				// Do not modify the Session: just set the participate flag.
				participate = true;
			}
			else {
				LOG.debug("Opening single Hibernate Session in HibernateLazyResolver");
				session = getSession(sessionFactory);
				TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session));
			}
		}
		else {
			// deferred close mode
			if (SessionFactoryUtils.isDeferredCloseActive(sessionFactory)) {
				// Do not modify deferred close: just set the participate flag.
				participate = true;
			}
			else {
				SessionFactoryUtils.initDeferredClose(sessionFactory);
			}
		}
		
	}

	/**
	 * 释放 session, 在 lazy 的结束处调用
	 *
	 */
	public void releaseSession() {
		if (!participate){
			if (isSingleSession()) {
				// single session mode
				SessionHolder sessionHolder =
						(SessionHolder) TransactionSynchronizationManager.unbindResource(sessionFactory);
				LOG.debug("Closing single Hibernate Session in HibernateLazyResolver");
				closeSession(sessionHolder.getSession(), sessionFactory);
			}
			else {
				// deferred close mode
				SessionFactoryUtils.processDeferredClose(sessionFactory);
			}
		}
	}
		
	/**
	 * Get a Session for the SessionFactory that this filter uses.
	 * Note that this just applies in single session mode!
	 * <p>The default implementation delegates to SessionFactoryUtils'
	 * getSession method and sets the Session's flushMode to NEVER.
	 * <p>Can be overridden in subclasses for creating a Session with a custom
	 * entity interceptor or JDBC exception translator.
	 * @param sessionFactory the SessionFactory that this filter uses
	 * @return the Session to use
	 * @throws DataAccessResourceFailureException if the Session could not be created
	 * @see org.springframework.orm.hibernate3.SessionFactoryUtils#getSession(SessionFactory, boolean);
	 * @see org.hibernate.FlushMode#NEVER
	 */
	protected Session getSession(SessionFactory sessionFactory) throws DataAccessResourceFailureException {
		Session session = SessionFactoryUtils.getSession(sessionFactory, true);
		session.setFlushMode(FlushMode.AUTO);
		return session;
	}

	/**
	 * Close the given Session.
	 * Note that this just applies in single session mode!
	 * <p>Can be overridden in subclasses, e.g. for flushing the Session before
	 * closing it. See class-level javadoc for a discussion of flush handling.
	 * Note that you should also override getSession accordingly, to set
	 * the flush mode to something else than NEVER.
	 * @param session the Session used for filtering
	 * @param sessionFactory the SessionFactory that this filter uses
	 */
	protected void closeSession(Session session, SessionFactory sessionFactory) {
		session.flush();
		SessionFactoryUtils.releaseSession(session, sessionFactory);
	}
	
	
}



分享到:
评论

相关推荐

    Hibernate延迟加载以及利用Spring

    ### Hibernate延迟加载以及利用Spring #### 一、Hibernate延迟加载概念与原理 在理解Hibernate的延迟加载机制之前,我们首先需要了解什么是延迟加载。延迟加载(Lazy Loading)是一种设计模式,其核心思想是在真正...

    SSH2 annotation 实现struts2.1.6 spring2.5.6 hibernate3.3 全注解开发

    关于“Hibernate延迟加载_懒加载具体应用”,这是Hibernate的一个重要特性。当你声明一个实体的一对多或一对一关系为“懒加载”时,不会在获取主对象时立即加载关联对象,而是在第一次访问这些关联对象时才发起...

    Spring延迟加载和声明式事务处理最终解决方案(修正版)

    在Spring与Hibernate整合时,延迟加载功能可能会遇到问题,因为Spring通过HibernateTemplate或JPA的EntityManager对数据库操作进行了抽象和封装。这种封装在提高代码可维护性的同时,可能导致在方法执行完毕后,...

    Spring 和Hibernate 整合笔记和jar包

    - **懒加载(Lazy Loading)**:Hibernate支持关联对象的延迟加载,避免一次性加载大量数据。 - **批处理**:Spring可以设置批处理大小,批量处理数据库操作,提升效率。 7. **测试与调试** - **单元测试**:...

    Struts,Spring与hibernate集成

    10. **处理Hibernate延迟加载问题**:为了解决由于Session生命周期和HTTP请求生命周期不匹配导致的延迟加载问题,可以使用OpenSessionInViewFilter。这个过滤器确保Session在请求结束时才关闭,从而能正确处理延迟...

    Strut+Spring+Hibernate框架的工作原理

    Hibernate提供了延迟加载机制,可以在真正需要数据时才将其加载到内存中,从而节省服务器的内存开销。Hibernate的延迟加载机制可以分为两种: 1. 实体对象的延迟加载 2. 集合的延迟加载 Hibernate的映射关系 ...

    ssh集成jar包,支持spring集成Hibernate,spring集成struts2等

    - Hibernate支持延迟加载(Lazy Loading),提高性能,只在需要时加载数据。 - 使用SessionFactory和Session接口进行数据库会话管理,支持HQL(Hibernate Query Language)和SQL进行查询。 3. **Struts2框架**: ...

    Struts,Spring,Hibernate三大框架的面试&笔试题

    3. Hibernate的延迟加载:实体对象和集合的延迟加载策略,以及在何时真正加载数据以提高性能。 4. Struts1的流程:MVC模式下的请求处理步骤,包括ActionServlet、ActionForm、Action和视图的交互。 5. Struts与...

    Spring2.5+Hibernate3.2开发手册

    3. **实体生命周期管理**:支持了预加载(pre-fetching)和延迟加载(lazy-loading),以及更灵活的实体状态管理,比如“脱管”(detached)状态。 4. **更丰富的类型支持**:包括对数组、集合和自定义类型的支持,...

    spring+hibernate+struts企业面试题(精华)

    6. **懒加载和Eager加载**:优化性能的技术,懒加载延迟关联对象的加载,而Eager加载会在查询时一起加载关联对象。 **Struts框架:** 1. **MVC模式**:Struts是基于Model-View-Controller设计模式的,负责协调用户...

    Hibernate、Spring和Struts工作原理及使用理由

    Hibernate支持实体对象和集合的延迟加载,只有在实际需要时才会加载相关数据,节省内存,提高性能。 **类间关系**: Hibernate通过配置文件支持一对一、一对多、多对一和多对多的关系映射。 **缓存机制**: - **一...

    Spring,hibernate,struts常见的面试笔试题汇总

    Hibernate提供延迟加载机制,以提高性能,只在需要时加载数据。它支持多种关系,如一对一、一对多和多对多,通过配置文件中的many-to-one、one-to-many、many-to-many等注解实现。Hibernate的缓存机制包括一级缓存...

    spring+hibernate多层web开发eclipse下的开发模板.doc

    结合 Spring 的事务管理能力,我们可以有效地解决延迟加载带来的潜在问题,确保应用程序在不同场景下的稳定性和性能表现。 ##### 2.3 国际化和中文支持 对于一个多语言的应用来说,国际化非常重要。本模板提供了...

    hibernate的延迟检索在轻量级J2EE框架中的应用

    - **Spring集成**:Spring可以很好地集成Hibernate,通过Spring的事务管理器,可以更好地控制事务边界,同时利用Spring的AOP特性,可以更加灵活地管理延迟加载的行为。 - **业务逻辑优化**:在业务逻辑层,合理使用...

    struts+spring+hibernate

    Struts、Spring和Hibernate是Java Web开发中的三个重要框架,它们各自解决了一部分软件开发中的问题,而将它们集成在一起,可以构建出高效、稳定且易于维护的企业级应用。 Struts是一个基于MVC(Model-View-...

    Tapestry5 + spring + hibernate 开发指南

    Hibernate 延迟加载配置 - **实体属性**:标记为懒加载以提高性能。 - **集合属性**:对于多对多或一对多关系使用懒加载。 #### IX. 结论 本文档提供了一个关于如何使用 Tapestry5、Spring 和 Hibernate 构建 ...

    struts+spring+hibernate面试题

    在Java Web开发中,Struts、Spring和Hibernate是最常见的三大框架,它们各自承担着不同的职责。以下将分别介绍这些框架的核心概念以及在面试中可能涉及的知识点。 1. Struts作为MVC框架,负责控制层的处理。MVC模式...

    最新Struts和Hibernate和Spring经典面试题

    Hibernate 的延迟加载可以通过实体对象、集合(Collection)和属性的延迟加载实现。当 Hibernate 在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载。 3...

Global site tag (gtag.js) - Google Analytics