在项目开发中,使用了SSH框架集成时,多处都会用到Session。在对Session的使用维护上,有如下几种看法:
1.getCurrentSession(); 
获得当前会话中的session,该session有容器自行维护管理,Spring可以代理事务。
2.this.getSession();
从当前的执行中获得或创建一个hibernate的session对象,需要自己手动关闭,以释放连接资源。
3.openSession();
调用函数自行创建一个数据库的连接,并将其打开,在使用Spring操作非查询语句的请况下,Spring的事务对该session对象不起到事务管理的作用,所以该session对象应当由程序员自己关闭,释放连接资源。

以上三种操作session的方式,我们都离不开这样的操作主线:

打开Session,开始一个事务,处理异常,提交一个事务,最后关闭一个Session。

如果我们自己只专注于业务,不想去作这些重复而繁琐的操作,那这样的一套操作对我们来讲太繁琐了!

相信任何一个程序员,都不想重复敲着那一遍又一遍雷同的代码!


在Spring的框架中,HibernateTemplate包装了Hibernate的代码,提供了相当多有用的辅助功能。Spring的HibernateTemplate可以帮我们完成这样的工作,使用声明式的配置来实现这样的功能。既然使用了SSH集成,那就要充分利用好Spring的这个功能吧,当然如果你还担心spring到底有没有关闭session的话,不妨看看这个文章:【那个看起来有点2但不2的程序员做的一件事:验证HibernateTemplate有没有关闭session:http://songzj.iteye.com/blog/766148】


但是如果我们非得使用session来完成业务而又不想去管事务上的事,那就意味着我们放弃了上面所说的一切好处!

Spring,她依然可以帮我们完成这种有点BT的需求。


HibernateTemplate提供HibernateCallback,就是为了满足这种使用了HibernateTemplate的情况下,仍然需要直接访问Session的需求而来的。它提供了在HibernateTemplate里面直接访问Session的能力,程序员不必人为的管理session对象(这个就是使用HibernateCallback的原因http://blog.163.com/yeyhan/blog/static/44179333201022942856795/)。

首先,应该确保我们的DAO已经继承了HibernateDaoSupport。

于是,如果我们可以参考如下形式书写:

@SuppressWarnings("unchecked")
	public Page queryData(final String countSql, final String resultSql,
			final int startIndex, final int pageSize, final long total) {
		Page result = (Page) getHibernateTemplate().execute(
				new HibernateCallback() {
					public Object doInHibernate(Session session)
							throws HibernateException, SQLException {
						long totalCount = 0;
						if (total < 0) {
							List countlist = session.createSQLQuery(countSql)
									.list();
							totalCount += Long.parseLong(countlist.get(0)
									.toString());
						} else {
							totalCount = total;
						}

						if (totalCount < 1) {
							return new Page();
						}

						// 实际查询返回分页对象
						Query query = session
								.createSQLQuery(resultSql)
								.addScalar("carLsh", Hibernate.INTEGER)
								.addScalar("carPic", Hibernate.STRING)
								.addScalar("carInfo", Hibernate.STRING)
								.addScalar("carColor", Hibernate.STRING)
								.addScalar("carType", Hibernate.STRING)
								.setResultTransformer(
										Transformers.aliasToBean(CarInfo.class));

						if (pageSize > 0) {
							if (startIndex < 0) {
								query.setFirstResult(0);
							} else if (startIndex >= totalCount) {
								return new Page();
							} else {
								query.setFirstResult(startIndex);
							}

							if (startIndex + pageSize > totalCount) {
								query.setMaxResults((int) totalCount
										- startIndex);
							} else {
								query.setMaxResults(pageSize);
							}

						}
						return new Page(startIndex, totalCount, pageSize, query
								.list());
					}
				});
		return result;
	}





Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐