谈这个问题前,我先介绍下hibernate查询
- hibernate查询分为两种:get()和load()
首先介绍get()和load()方法的区别:
get()方法和load()方法的区别主要在于对二级缓存的使用上。
load()方法会使用二级缓存,而get()方法在一级缓存没有找到会直接查询数据库,不会去二级缓存中查找。
get():如果在数据库中没有记录会返回空,get()无论如何都会返回数据.
注意:load():如果数据库中没有记录会抛出异常,如果有数据返回的是一个代理对象。
get()方法默认不支持lazy(延迟加载)功能,而load支持延迟加载
get()方法在查询不到数据时,返回null,而load因为支持延迟加载,只有在使用对象时才加载,所以如果数据库中不在数据load会抛出异常(org.hibernate.ObjectNotFoundException)。
get()和load()只根据主键查询,不能根据其它字段查询,如果想根据非主键查询,可以使用HQL
当我们配置Spring事务时,一般都配置在service层,这就产生了一个问题:我们使用hibernate的load()返回时一个代理对象,当我们在jsp页面开始查询时,就开始真正的发出sql语句进行查询,结果就发现session对象已经关闭了,所以就产生了上述图片的异常
- 解决方案一:使用get()方法。
———-但是会产生一个问题:如果这个对象关联了许多的对象(如老师关联了所教课程、所教班级)
如果你讲fatchType设置为eager不会产生问题,能将所有信息查出
但是如果你设置的为lazy,当你是jsp页面使用的还是代理对象,还要发出SQL语句
2.解决方案二:配置session的范围
———-在web.xml配置如下