/*
* @(#)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延迟加载概念与原理 在理解Hibernate的延迟加载机制之前,我们首先需要了解什么是延迟加载。延迟加载(Lazy Loading)是一种设计模式,其核心思想是在真正...
关于“Hibernate延迟加载_懒加载具体应用”,这是Hibernate的一个重要特性。当你声明一个实体的一对多或一对一关系为“懒加载”时,不会在获取主对象时立即加载关联对象,而是在第一次访问这些关联对象时才发起...
在Spring与Hibernate整合时,延迟加载功能可能会遇到问题,因为Spring通过HibernateTemplate或JPA的EntityManager对数据库操作进行了抽象和封装。这种封装在提高代码可维护性的同时,可能导致在方法执行完毕后,...
- **懒加载(Lazy Loading)**:Hibernate支持关联对象的延迟加载,避免一次性加载大量数据。 - **批处理**:Spring可以设置批处理大小,批量处理数据库操作,提升效率。 7. **测试与调试** - **单元测试**:...
10. **处理Hibernate延迟加载问题**:为了解决由于Session生命周期和HTTP请求生命周期不匹配导致的延迟加载问题,可以使用OpenSessionInViewFilter。这个过滤器确保Session在请求结束时才关闭,从而能正确处理延迟...
Hibernate提供了延迟加载机制,可以在真正需要数据时才将其加载到内存中,从而节省服务器的内存开销。Hibernate的延迟加载机制可以分为两种: 1. 实体对象的延迟加载 2. 集合的延迟加载 Hibernate的映射关系 ...
- Hibernate支持延迟加载(Lazy Loading),提高性能,只在需要时加载数据。 - 使用SessionFactory和Session接口进行数据库会话管理,支持HQL(Hibernate Query Language)和SQL进行查询。 3. **Struts2框架**: ...
3. Hibernate的延迟加载:实体对象和集合的延迟加载策略,以及在何时真正加载数据以提高性能。 4. Struts1的流程:MVC模式下的请求处理步骤,包括ActionServlet、ActionForm、Action和视图的交互。 5. Struts与...
3. **实体生命周期管理**:支持了预加载(pre-fetching)和延迟加载(lazy-loading),以及更灵活的实体状态管理,比如“脱管”(detached)状态。 4. **更丰富的类型支持**:包括对数组、集合和自定义类型的支持,...
6. **懒加载和Eager加载**:优化性能的技术,懒加载延迟关联对象的加载,而Eager加载会在查询时一起加载关联对象。 **Struts框架:** 1. **MVC模式**:Struts是基于Model-View-Controller设计模式的,负责协调用户...
Hibernate支持实体对象和集合的延迟加载,只有在实际需要时才会加载相关数据,节省内存,提高性能。 **类间关系**: Hibernate通过配置文件支持一对一、一对多、多对一和多对多的关系映射。 **缓存机制**: - **一...
Hibernate提供延迟加载机制,以提高性能,只在需要时加载数据。它支持多种关系,如一对一、一对多和多对多,通过配置文件中的many-to-one、one-to-many、many-to-many等注解实现。Hibernate的缓存机制包括一级缓存...
结合 Spring 的事务管理能力,我们可以有效地解决延迟加载带来的潜在问题,确保应用程序在不同场景下的稳定性和性能表现。 ##### 2.3 国际化和中文支持 对于一个多语言的应用来说,国际化非常重要。本模板提供了...
- **Spring集成**:Spring可以很好地集成Hibernate,通过Spring的事务管理器,可以更好地控制事务边界,同时利用Spring的AOP特性,可以更加灵活地管理延迟加载的行为。 - **业务逻辑优化**:在业务逻辑层,合理使用...
Struts、Spring和Hibernate是Java Web开发中的三个重要框架,它们各自解决了一部分软件开发中的问题,而将它们集成在一起,可以构建出高效、稳定且易于维护的企业级应用。 Struts是一个基于MVC(Model-View-...
Hibernate 延迟加载配置 - **实体属性**:标记为懒加载以提高性能。 - **集合属性**:对于多对多或一对多关系使用懒加载。 #### IX. 结论 本文档提供了一个关于如何使用 Tapestry5、Spring 和 Hibernate 构建 ...
在Java Web开发中,Struts、Spring和Hibernate是最常见的三大框架,它们各自承担着不同的职责。以下将分别介绍这些框架的核心概念以及在面试中可能涉及的知识点。 1. Struts作为MVC框架,负责控制层的处理。MVC模式...
Hibernate 的延迟加载可以通过实体对象、集合(Collection)和属性的延迟加载实现。当 Hibernate 在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载。 3...