hibernate中的Session关系到对数据库的增删查改等基本的数据存取操作。对Session进行有效的维护,就像是在jdbc编程中对JDBC collection的维护。
问题?
Hibernate级联查询时,如果对于级联对象的lazy属性配置为true,那么在真正使用到级联对象时,会出现session关闭的提示。
解决方法:
在struts+hibernate的方案中,常常利用过滤器(Filter)对session进行管理,以实现session在线程范围内的共享。为什么仅仅实现线程内的共享,是因为,不能把session用于多线程,否则会出现意外。在线程范围内实现sesion的共享,避免了session的频繁的创建和销毁。如果在单个方法内打开session,执行,关闭session,这显然没有在一次会话中有效的利用session。
下面的方案是.通过建立一个过滤器,以实现对sesion的共享:
public class HibernateSessionOpenInViewFilter implements Filter {
private static final Log log = LogFactory.getLog(HibernateSessionOpenInViewFilter.class);
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 开启一个事务
log.info(" Transaction begin...");
Session session = HibernateSessionFactory.getSession();
Transaction tx = session.beginTransaction();
try {
chain.doFilter(request, response);
tx.commit();
log.info("Transaction end. ");
} catch (Exception e) {
tx.rollback();
log.error("Transaction rollback. ");
} finally {
HibernateSessionFactory.closeSession();
log.info("Hibernate Session Close. ");
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
在web.xml文件中对上面的过滤器进行配置:
<filter>
<filter-name>hibernateSession</filter-name>
<filter-class>com.utils.filter.HibernateSessionFilter </filter-class>
</filter>
<filter-mapping>
<filter-name>hibernateSession</filter-name>
<servlet-name>action</servlet-name>
</filter-mapping>
对所有以.do作为后缀名的url,都会被过滤器过滤.在被过滤器过滤的action中,和业务层的方法内,只需要调用HibernateSessionFactory 的getSession()方法,得到当前线程内的session对象,用完session后,不要关闭session,而且,每次在用session进行添加和修改操作时,也不需要启动事务。
分享到:
相关推荐
Hibernate 中对session的管理!
hibernate中session的管理描述。 hibernate中session的管理描述。
Session是Hibernate中应用最频繁的接口,Session也被称为持久化管理器,它负责所有的持久化工作,负责管理持久化对象的生命周期,提供第一级别的高级缓存来保证持久化对象的数据与数据库同步
主要介绍了Hibernate管理Session和批量操作的技巧,包括Hibernate管理Session、批量处理数据等的常用技巧及注意事项,具有一定的参考借鉴价值,需要的朋友可以参考下
由于J2EE的开源的框架中提供了MVC模式实现框架Struts、对象关系模型中的Hibernate 的框架及拥有事务管理和依赖注入的Spring。利用现存框架可以更快开发系统。所以选择Java技术作为blog 的开发工具。 为了增加系统的...
其中Hibernate每次都需要手动创建SessionFactory,Session,手动开启提交关闭事务。而这一切操作完全是由Spring来代替。使持久层更加方便,使开发人员减少持久层操作,把注意力放到业务上。
Hibernate Web应用的开发一般经过以下几个步骤: ...(7)通过创建的Session实例进行持久化对象的管理。 (8)通过创建的Transaction实例进行事务管理。 (9)通过创建的Query或Criteria实例实现数据库的查询。
(1)Configuration:用于解析hibernate.cfg.xml文件和XXXXX.hbm.xml文件,并创建SessionFactory对象。Configuration对象用于配置并且启动Hibernate。...(3)Session:也被称为持久化管理器,对象级数据库操作。
TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(hibernateSession)); ``` 然后,在类中加入以下两个私有函数: ```java private SessionFactory lookupSessionFactory...
SpringMVC+Hibernate+annotation+Easyui权限管理系统,Session过期控制(包括Ajax请求的过期控制),访问权限控制(权限控制到按钮),hibernate数据库用户名与密码加密,其它的不说了,绝对物有所值
在Hibernate中使用两极缓存结构,第一级缓存是Session级别的缓存,Session级别的缓存是由Hibernate管理的,一般情况下无需进行干预.第二级缓存是 SessionFactory级别的缓存,SessionFactory级的缓存可以进行配置和...
Hibernate主键生成策略,Hibernate持久化对象,Hibernate中session的管理
3.5.2 访问Hibernate的Session接口 3.6 运行helloapp应用 3.6.1 创建运行本书范例的系统环境 3.6.2 创建helloapp应用的目录结构 3.6.3 把helloapp应用作为独立应用程序运行 3.6.4 把helloapp应用作为...
有效的Session管理:Spring提供了有效、简单、安全的Hibernate Session处理。 IoC容器降低了DAO组件与业务逻辑层之间的耦合性。 DAO模式的使用,降低了系统重构的代价。 方便的事务管理:Spring提供的声明式事务处理...
hibernate 学习资料 Session接口 Query和Criteria接口 Hibernate主键介绍 二级缓存的管理
Hibernatetools 插件、Session 核心方法、持久化对象生命周期、对象关系映射(1-n、1-1、n-n、继承映射)、检索策略、检索方式(对象导航图、OID 检索、HQL、QBC、本地SQL)、Hibernate 一\二级缓存、管理 ...
Hibernate Session的轻量级封装 * 默认情况下运行期异常才会回滚(包括继承了RuntimeException子类),普通异常是不会滚的 * 编写业务逻辑方法时,最好将异常一直向上抛出,在表示层(struts)处理 * 关于事务...
3.8.3. 在JTA环境下使用Current Session context (当前session上下文)管理 3.8.4. JMX部署 4. 持久化类(Persistent Classes) 4.1. 一个简单的POJO例子 4.1.1. 实现一个默认的(即无参数的)构造方法...
hibernate: 管理实体关系映射 spring:数据源配置与获得session IOC依赖注入 和 AOP 事务管理 jsf : backing bean的操作 jsf 标签应用 jsf 信息国际化以资源绑定 jsf 表单验证 jsf 导航设定
内容涵盖安装 Hibernatetools 插件、Session 核心方法、持久化对象生命周期、对象关系映射、检索策略、检索方式、Hibernate 一\二级缓存、管理 Session、批量处理等 Hibernate 企业级开发的核心技术。