hibernateTemplate的load方法

hibernateTemplate的load方法采用延迟加载,所以应当注意。

如果配置不当,采用此方法获取对象,往往会出现异常:

javax.servlet.ServletException: org.hibernate.LazyInitializationException: could not initialize proxy - no Session

出现此异常一般是因为session已关闭,无法获取对象。

测试代码:

以下是部门的实现类DeptDaoImpl的一个方法——通过部门id获取指定部门

public Dept findById(int did) {
        return hibernateTemplate.load(Dept.class, did);
    }

以下是DeptService中相应的方法

public Dept findById(int id){
        return deptDaoImpl.findById(id);
    }

测试类测试此方法,出现异常:javax.servlet.ServletException: org.hibernate.LazyInitializationException: could not initialize proxy - no Session

分析:为什么此处会出现异常呢?这是因为执行Dept d= deptService.findById(156);这一句后session已关闭,且因为在DeptDaoImpl采用的load的方法——延迟加载,它并不会从数据库中加载id为156的这个部门,因此执行System.out.println(d.getDname());出现此异常。

@Test
    public void getDeptById(){//load
        //error
        Dept d= deptService.findById(156);
        System.out.println(d.getDname());
    }

下面将 System.out.println(d.getDname());这句代码放在DeptService进行测试

public void test(int id){
        Dept d=deptDaoImpl.findById(id);
        System.out.println(d.getDname());
    }

成功,打印信息:

技术部

分析:为什么能在DeptService能够获得指定部门的部门名称呢?

——这是因为在spring的配置文件中(spring.xml)中对service中的方法进行了aop管理,所以在执行 System.out.println(d.getDname());时session并未关闭,因此可以打印信息(此外需说明的是,在执行 Dept d=deptDaoImpl.findById(id);语句时,session并未与数据库交互,执行System.out.println(d.getDname())才向数据库发送相应SQL——这是因为load方法采用延迟加载。)

解决方法:

若采用load方法,需配置opensessioninview,这样就可以了。

时间: 2024-08-10 12:38:18

hibernateTemplate的load方法的相关文章

jQuery_review 之 通过.load()方法来实现异步加载HTML文档

原生的ajax编写起来是相当麻烦的一件事情,我们不仅仅要处理不同浏览器下的XMLHttpRequest对象不同的初始化,还需要识记大量的XMLHttpRequest对象的属性和方法,而且做的很多都是重复性的工作,就如同jdbc的实现方式是一样的,JDBC有很多固定的模式,所以不管是Hibernate还是Ibatis亦或是Spring都使用模板模式来封装了大量相同的调用,让整个方法变得更加容易使用.对于程序员来说,这些都是一些非常好的事情,因为再也不用重复造轮子了,重复造轮子,成本高,性能也未必与

load()方法

1. 载入HTML文档 load()方法是jquery中最为简单和常用的ajax方法,能够载入远程HTML代码并插入DOM中,结构为:   load(url [, data] [ , callback]) 参数名称 类型 说明 url String 请求HTML页面的URL地址 data(可选) Object 发送至服务器的key/value数据 callback(可选) Function 请求完成时的回调函数,无论请求成功与否 $(function () { $("#send").c

html5 audio标签 load方法

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

hibernate架构之session中get与load方法的区别

hibernate是一个用于连接数据库的升级版JDBC,与一般JDBC不同的是,hibernate架构是通过hql进行查找,通过session建立连接.其工作原理是:将实例分为瞬时状态.持久状态.游离状态,通过hql对持久状态的实例进行CRUD.在学习的过程中我们遇到了这样的一个现象:用Session对象调用get()方法和load()方法获取对象时,类似的代码会分为两种结果,get方法运行成功,load方法会报错,代码示例如下: get()方法源代码: Session session= Hib

Hibernate中get方法和load方法的区别

1.从返回结果上对比: load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常: get方法检索不到的话会返回null: 2.从检索执行机制上对比: load方法的执行则比较复杂首先查找session的persistent Context(一级缓存)中是否有缓存,如果有则直接返回,如果没有则去查找二级缓存,如果有则返回,如果没有则判断是否是lazy,若不是lazy,直接访问数据库检索,查到记录返回(并且同时在二级缓存中存放查到的数据方便下次使

hibernate中懒加载和急加载的区别,以及hibernate中get()方法和load()方法的区别

* 懒加载在加载一个实体的时候,不会马上从数据库中加载,即从数据库中加载到内存.而急加载在加载一个实体时,会立即从数据库中查询,与其关联的类也会被同时查询. 急加载就会很快,因为在第一次加载的时候,已经帮我们全部加载好了.而懒加载则会相对慢一些,因为在我门需要查询的时候,它才会执行sql操作. 所以懒加载的优点是占用内存小,执行速度慢;急加载是执行速度快,占用内存高 hibernate的get()he load()方法在执行的时候又很大的区别, 执行get()方法会把所有的基本数据全部加载, 而

Hibernate中Session之get和load方法的真正区别

最近在学习SHH框架中的hibernate,对Session的get和load方法,有点混不清楚,不知道区别在哪,或者对它们的区别感触不深.所以百度了一下,结果问题来了.百度的结果和实际测试的结果出入很大.主要是对get方法的说法跟实际运行的结果不一致. 先说一下观点吧: get不支持lazy,load支持lazy: 数据不存在时,get返回null,load则抛出ObjectNotFoundException异常. load方法可以返回实体的代理类实例,而get方法直接读取数据库,所以直接返回

Hibernate 中 load() 方法导致的 noSession 异常

之所以要写这个,是因为最近碰到了一个延迟加载的 load() 导致出现 noSession 的异常. 解决这个问题需要用到一个本地线程的对象,也就是 ThreadLocal 类,之前写过关于这个对象,可以看这个博客[本地线程 ThreadLocal 类] 我在数据层中封装了一个 load() 方法,根据用户 Id 获取用户对象: public UserModel get(Long uuid) { return this.getHibernateTemplate().load(UserModel.

jquery easyui datagrid.load方法参数传递问题 .

转自:http://blog.csdn.net/huanfengcheng/article/details/53118704 今天在写一个自己搭建的springvmc+easyui的项目,出现的一个传值问题,如下 $(document).ready(function(){ $("#seacher").click(function(){                                          $('#dg').datagrid('load',{