关于spring中对延迟关闭session的配置,以及工具类BaseDao和BaseAction
一、HibernateTemplate执行查询时的一些小问题
1.当两个PO类的关系是多对一时:
我们知道在多对一关系中,查询总是会先查询“一”的一方,而一的一方中是含有集合的,一谈到集合就不得不考虑关于hibernate中集合的加载策略,
集合的加载策略默认是懒加载的,我们可以自己手动的去配guanlu置这个加载策略!
然而我们这里讨论的是:当查询“一”的一方的数据完毕时session就会被关闭,而集合中的数据并没有加载所以在页面想获取时是获取不到的,我们想要懒加载能加载到数据,所以必须要延迟关闭session这样才能保证能查询到数据!
而这里我们想要延迟关闭session应该怎么做呢?spring提供了一个过滤器OpenSessionInViewFilter,只要请求还没有结束就不会关闭session
在web.xml中配置这样一个过滤器
<!-- 延迟关闭session的过滤器 ,这个过滤器是由spring提供的 需要在struts过滤器之前执行才可以这样一来session就是由我们这个过滤器创建的,到时候关闭也是由过滤器延迟关闭--> <filter> <filter-name>openSession</filter-name> <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>openSession</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
二、关于工具类BaseDao的思想与编写!
1.根据项目代码可知,我们在Dao层操作的代码很多都是重复性很大的代码,而人对于重复性的东西是能简化就简化的,例如增删改查基本上在每个Dao中的相似性极高,我们就可以将重复性的代码抽取出来,将其写成一个工具类,然后以后的Dao只需要去继承这个类即可,不需要再去写一些重复性的代码!
2.思想的构图如下:
在这里我们要附带介绍一下this关键字
this是指当前运行时类的对象,不是指当前对象,注意 观察下面代码的结果
public class Parent { public void init(){ System.out.println("我是Parent的init 1"); this.demo(); } public void demo(){ System.out.println("我是Parent 的 demo 2"); } }
public class Child extends Parent { @Test public void fun(){ init(); } //研究发现this关键字,是指的运行时类的对象 public void init(){ super.init(); System.out.println("我是Child的 init 3"); this.demo(); } public void demo(){ System.out.println("我是Child的demo 4"); } }
运行后的结果为:
我是Child的 init 1
我是Child的 init 4
我是Child的 init 3
我是Child的 init 4所以this指的是当前运行时类的对象
原文地址:https://www.cnblogs.com/zwxbky/p/11403101.html
时间: 2024-10-10 18:42:53